递归讲解
- 递归在实现过程中是借助于栈来实现的。
- 高级语言的函数调用,每次调用,系统都要自动为该次调用分配一系列的栈空间用于存放此次调用的相关信息:返回地址,局部变量等。这些信息被称为工作记录(或活动记录)。而当函数调用完成时,就从栈空间内释放这些单元,但是,在该函数没有完成前,分配的这些单元将一直保存着不被释放。
- 递归函数的实现,也是通过栈来完成的。在递归函数没有到达递归出口前,都要不停地执行递归体,每执行一次,就要在工作栈中分配一个工作记录的空间给该“层”调用存放相关数据,只有当到达递归出口时,即不再执行函数调用时,才从当前层返回,并释放栈中所占用的该“层”工作记录空间。请大家注意,
递归调用时,每次保存在栈中的是局部数据,即只在当前层有效的数据,到达下一层时上一层的数据对本层数据没有任何影响,一切从当前调用时传过来的实在参数重新开始。
汉诺塔实例
#include <stdio.h>
int hanoi(int n, char x, char y, char z);
int main(void) {
char x = 'x';
char y = 'y';
char z = 'z';
int num;
printf("请输入汉诺塔中的圆盘个数:\n");
scanf("%d", &num);
hanoi(num, x, y, z);
return 0;
}
int hanoi(int n, char x, char y, char z){
if (n == 1){
printf("%c -- > %c\n", x, z);
}else{
hanoi(n-1, x, z, y);
printf("%c -- > %c\n", x, z);
hanoi(n-1, y, x, z);
}
return 0;
}