标签:
递归就是函数间接的调用自己, 它的实现基于函数参数传递的栈机制, 每次递归递归调用都会多一个栈帧——和简单的函数调用并没有什么不同 (都是使用了调用栈)。调用自己和调用其它函数并没有本质的区别, 都是建立新栈帧, 传递参数并修改当前代码行。在函数体执行完毕后删除栈帧, 处理返回值并修改当前代码行。
递归在数据结构中占有很重要的,特别是, 树和图的建立, 和遍历。 使用递归能使代码更清晰, 更简洁, 但是调试时会很麻烦, 所以, 对于递归要熟练应用且小心应用。
下面是几个简单的应用举例:
<1>. 汉诺塔问题, 有三个钢针, A, B, C, A 上有n个圆盘, 大的在下面, 小的在上面, 你可以借借助B针, 把A针上的圆盘移到C盘上,(任何时候较大盘都不能放在较小盘上), 对于一个不太大的n(据说n等于64时, 每秒移动一次, 宇宙会在完成的那一瞬间毁灭, 嘿嘿!!), 请给出移动次数最少的解决方案!
1 #include<stdio.h> 2 3 void Move(int n, char A, char B) 4 { 5 printf("Move disk %d from %c to %c\n", n, A, B); 6 } 7 8 void hanoi(int n, char A, char B, char C) 9 { 10 if(n==1) Move(1, A, C); 11 else 12 { 13 hanoi(n-1, A, C, B); 14 Move(n, A, C); 15 hanoi(n-1, B, A, C); 16 } 17 } 18 19 int main() 20 { 21 int n; 22 while(scanf("%d", &n)!=EOF, n) 23 { 24 hanoi(n, ‘A‘, ‘B‘, ‘C‘); 25 } 26 return 0; 27 }
标签:
原文地址:http://www.cnblogs.com/acm1314/p/4510323.html