首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

【算法】栈与递归的兑现

2012-11-26 
【算法】栈与递归的实现一:函数的调用当在一个函数调用期间调用另一个函数时,在运行被调函数之前要做的三件

【算法】栈与递归的实现

一:函数的调用

当在一个函数调用期间调用另一个函数时,在运行被调函数之前要做的三件事情:

1.将所有实际参数,返回地址(函数调用之后的下一条语句的地址)等信息传递给被调函数保存

2.为被调函数的局部变量(也包括形参)分配存储空间

3.将控制转移到被调函数的入口

在被调函数返回到主调函数之前也要做三件事:

1.保存被调函数的返回结果

2.释放被调函数所占的存储空间(局部变量)

3.依照被调函数保存的地址将控制返回到主调函数

当有多个函数相互调用时,按照“后调用后返回”的原则,上述函数之间的信息传递和控制转移必须借助“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每调用一个函数时就在栈顶分配一个存储区,进行压栈操作,每当一个函数退出时,就释放它的存储区,进行出栈操作,当前运行的函数永远早栈顶位置

A调用A函数和A函数调用B函数在计算机看来是没有任何区别的!

二:递归满足的三个条件

Fact(n)=1;(n=1)

Fact(n)= Fact(n-1)*n;(n>1)

1.递归必须得有一个明确的终止条件

2.该函数说出你的数据规模必须在递减

3.这个转换必须是可解的

三:递归和循环

1.递归:易于理解、速度慢、所需存储空间大

2.循环:不易理解、速度快、浪费空间小

四:汉诺塔算法实现

#include <stdio.h>int Hanluota(int n,char x,char y,char z){static int count=0;/*将n个盘子借助y从x移到z*/if (n==1){printf("%d:%c->%c\n",n,x,z);count++;}else{Hanluota(n-1,x,z,y);printf("%d:%c->%c\n",n,x,z);count++;Hanluota(n-1,y,x,z);}return count;}void main(){int n,count;printf("please input the n of the Hanluota:");scanf("%d",&n);count=Hanluota(n,'A','B','C');printf("总共需要移动%d次\n",count);}






热点排行