递归函数:含有(赋值语句,if-else,whille)结构的都可以改成递归。
问题本身是递归定义的,可以用递归表示算法。
递归是自顶向下运行但是计算是在回溯时计算。因此一般找到递归因子即可,忽略中间过程。
而迭代都是自低向上求解。
递归的2个条件:
1.构造递归终止的边界条件
2.实现递归调用
如:汉诺塔问题:有3个塔,A,B,C,第一个塔有n个盘子,盘子从上到下直径一次递增的顺序放置。目标是把A塔的盘子移动到B塔借助C塔。
思路:
假设有3个塔 A,B,C
A未初始塔,B为目标塔,C为辅助塔
A上有3个盘子
1.我们只需要把初始塔A的n-1个盘子移动到辅助塔C
2.然后初始塔A的最后一个盘子移动到目标塔B
3.这时我们解决的问题是把C的n-1个盘子移动到 B 借助A
把C视为初始塔,B视为目标塔,A视为辅助塔
把C移动到B借助A
这时就完成目标。
但是要想完成n-1个盘子的移动必须先完成n-2个盘子的移动......一直到1个盘子的移动,但是他们的过程都是这3步
总结:这个的递归因子是求n个的移动,即求n-1个盘子的移动...
结束条件是; n=1的时候结束
代码如下:
1 #include<stdio.h> 2 void move(int n,char x,char y); // 初始塔x->目标塔y 3 void hanoi(int n,char x,char y,char z); //x初始塔,y目标塔,c辅助塔 4 int i=1; 5 int main() 6 { 7 int n; 8 scanf("%d",&n); 9 char x='A',y='B',z='C'; //塔号 10 hanoi(n,x,y,z); //目标从x移到y借助z 11 return 0; 12 } 13 void move(int n,char x,char y) //从x移动到y 14 { 15 printf("%d:第%d个盘子:%c->%c ",i++,n,x,y); 16 } 17 void hanoi(int n,char x,char y,char z)//x初始塔,y目标塔,c辅助塔 18 { 19 if( n == 1 ) //结束条件 20 move(n,x,y); 21 else 22 { 23 hanoi(n-1,x,z,y); //x->z借助y 24 move(n,x,y); //移动 25 hanoi(n-1,z,y,x); //z->y借助x 26 } 27 } 28
递归最重要的是:找递归因子和结束条件