通过汉诺塔对递归的理解

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值