递归汉诺塔
1 #include<stdio.h> 2 3 void Hanoi(int count,char a,char b,char c){ 4 if(count == 1){ 5 printf("FROM %c TO %c\n",a,c); 6 }else 7 { 8 Hanoi(count-1,a,c,b); 9 printf("FROM %c TO %c\n",a,c); 10 Hanoi(count-1,b,a,c); 11 } 12 } 13 int main(){ 14 printf("please input the number of Hanoi:"); 15 int n; 16 scanf("%d",&n); 17 Hanoi(n,'A','B','C'); 18 return 0; 19 }
通常系统通常在一个函数运行期间调用另一个函数时,在运行被调用的函数之前,系统需要做3件事:(1)将所有的实参,返回地址等信息传递给被调用的函数保存。(2)为被调用的函数的局部变量分配存储区。(3)将控制转到被调用的函数的入口。从而在被调用的函数返回调用函数之前,系统通常也要做3件事:(1)保存被调函数的计算结果(2)释放被调函数的数据区(3)依照被调函数保存的返回地址将控制返回到调用函数。当有多个函数嵌套调用,按照先调用的后返回的原则,上述函数之间的信息传递和控制的转移必须必须通过栈来实现,即系统见整个程序运行期间的所需要的数据空间安排在一个栈中,每当调用一个函数就为它在栈顶分配一个存储区,每当一个函数退出运行时,就释放他的存储区,则当前正在运行的函数的数据必须是在栈顶的。递归函数的执行过程相当于多个韩式的嵌套调用,只是调用函数和被调用的函数是同一个函数。为了保证递归函数的正确进行,系统设立了一个递归工作栈作为真个递归函数运行期间使用的数据存储区,每一层递归所需的信息构成一个“工作记录”。其中包括所有的上一层的返回地址,所有的局部变量和实在的参数。每当进入一层递归,就产生一个新的工作记录压入栈顶,每当退出一层递归,就从栈顶弹出一项工作记录。
void Hanoi(int count,char a,char b,char c)
1 {
2 if(count == 1)
3 printf("FROM %c TO %c\n",a,c);
4 else{
5 Hanoi(count-1,a,c,b);
6 printf("FROM %c TO %c\n",a,c);
7 Hanoi(count-1,b,a,c);
8 }
9 }
下表给出了递归的执行过程,返回地址是程序中的代码的行号,主函数的地址为0;