什么是递归|如何使用递归解决汉诺塔问题|c++实现Hanoi

递归的概念:

递归是一种通过调用自身来解决问题的方法,即在函数体里调用自己。通过递归,问题会被划分成规模较小的子问题,递归地解决这些子问题,最终得到原始问题的解。

  • 明确函数的功能,知道函数要干什么

  • 找到递归结束条件,通过递归将问题分解,逐步缩小范围,直到最终分解至直接可解

  • 找出函数的等价关系式,即如何分解问题,如何缩小范围,下一个状态如当前状态的关系

边界条件和递归方程是递归的两大要素,当一个问题明显能分解为多个子问题,并且问题的解决方法相同,子问题也还能分解为子问题...可以考虑使用递归。不过,使用递归时,也要小心如果递归的深度过深很可能会因此爆栈,而导致程序挂掉。

递归是一种解决问题的思想,利用递归解决问题一定一定一定要在宏观上明确函数的功能,将其与功能的具体代码实现要自己能分别开来。

hanoi汉诺塔

思路分析

求n个盘子完成要求的步数或步骤;假如有n个盘子,如果想将这n个盘子从一个柱子上转移到另一个柱子上,那么就需要借助第三根柱子:我们先将起始棍上边的 n-1 个盘子借助目标棍转移到第三方棍,然后将最后一个盘子从起始棍移动到目标棍,最后将第三方棍上的 n-1 个盘子从第三方棍借助起始棍移动到目标棍。由此我们可以看成:既然移动 n 个盘子分为了三步,那么在我们移动 n-1个盘子时也可以考虑上述三个步骤......当盘子数为1时,我们直接就能移动盘子了。既然盘子数为1时解决了,那么显而易见我们就能知道盘子数为2也就解决了,继而当盘子数为3,4,5...n-1,n时,也就因为盘子数为1时问题得到解决带来的蝴蝶效应而得以解决。这个过程就可以通过递归实现。

取名ABC只是为了区分三根棍子,在每一轮中只有 起始棍 目标棍 和 第三方棍。

 Hanoi代码

#include<iostream>
using namespace std;
void move(char x,char y);
void hanoi(int n,char one,char two,char three);
int i=0;
int main()
{
     int m; 
     cout<<"输入盘子数:";
     cin>>m;;
     hanoi(m,'A','B','C');
}

void hanoi(int n,char one,char two,char three)
{
     if (n == 1)
     {
           move(one,three);
     }
     else
     {
         hanoi(n-1,one,three,two);
         move(one,three);
         hanoi(n-1,two,one,three);
     }
}
 
void move(char x, char y)
{
     cout<<x<<"-->"<<y<<" "<<++i<<endl;
} 

 

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不吃香菜的小趴菜

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值