通过汉诺塔对递归的理解

递归函数:含有(赋值语句,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  

递归最重要的是:找递归因子和结束条件

原文地址:https://www.cnblogs.com/hysz/p/7130837.html