​汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

摘自百度百科

相信大家很多都玩过或者听说过汉诺塔,下面我来举个例子:(当圆盘数为3时)

目标:将所有圆盘移动至2号杆(第2根杆子)

第一步:将黄色圆盘移动至2号杆上

第二步:将橙色圆盘移动至3号杆上

第三步:将黄色圆盘移动至3号杆上,置于橙色圆盘之上

第四步:将红色圆盘移动至2号杆上

第五步:将黄色圆盘移动至1号杆上

第六步:将橙色圆盘移动至2号杆上 ,置于红色圆盘之上

第七步:将黄色圆盘移动至2号杆上 ,置于橙色圆盘之上

至此,3圆盘的汉诺塔就已经完成了 。

从上面的图可以看出需要7步才能完成

汉诺塔步数的公式其实很简单,我再给你几个例子,你也能发现其中的规律

4层:15步

5层:31步

6层:63步

……

很明显,汉诺塔的步数公式为

步数=2的层数次方-1

很好。

但是我只知道有多少步,我想要知道每一步是怎样走的,又该怎么办呢?

我们现在来拆分一下汉诺塔问题:

1、将最上面的圆盘移到空柱子(2选1)上

2、(       )

3、 将最后一个圆盘移到空柱子(只有1个)上

仔细思考,你会发现第2部分就是一个层数-1的汉诺塔。这意味着什么?

递归介绍

抛开这些问题不谈,我们先来聊一聊递归

首先,我想和大家讨论一个问题:什么样的数,才能算是自然数?

换种方法说:自然数的定义,是什么?

也许你会说,很简单啊,像1,2,3……这样的数叫做自然数。

但这样并不严谨。

我认为,自然数的定义分为两条:

1、0是自然数

2、比自然数大1的数,是自然数

比如我想知道3是不是自然数,我会想:

只要2是自然数,3就是自然数;

怎么判断2是不是自然数呢?

只要1是自然数,2就是自然数;

怎么判断1是不是自然数呢?

只要0是自然数,1就是自然数;

定义已经告诉我们,0是自然数,

所以1是自然数,2是自然数,3是自然数。

像这样的思考方式或技巧,被称为递归(也叫递归算法)

程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的语句来定义对象的无限集合。

一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

摘自百度百科

上面已经告诉我们递归的意思了,但我想把它再翻译一下,让更多人能够听得懂

递归有两个部分:递归结束条件(边界条件),具体递归操作(递归前进段)

当满足递归结束条件时,递归返回,也就是return;

当不满足递归结束条件时,递归前进,也就是进行具体操作;

汉诺塔具体解法

汉诺塔问题的递归结束条件与具体递归操作如下

很简明易懂,对吧^_^

递归问题其实很简单,只要写出递归条件,代码就很好写了

我把代码放在了这里:

#include<bits/stdc++.h>
using namespace std;
int sum=0;//步数累加
int hanoi(int n,int a,int b,int c)
{      // 盘子数 起始1 目标3 暂存2if(n==1)//递归结束条件{sum++;cout<<"第"<<sum<<"步:盘子从"<<a<<"柱移至"<<b<<"柱"<<endl;return 0;}else//递归具体操作(为了使程序简洁,也可去掉else){hanoi(n-1,a,c,b);sum++;cout<<"第"<<sum<<"步:盘子从"<<a<<"柱移至"<<b<<"柱"<<endl;hanoi(n-1,c,b,a);}
}
int main()
{int x;cin >> x;hanoi(x,1,3,2);//调用函数return 0;
}

运行结果:

就这样了,这是我第一次写,如果有哪里需要改正,请提出来,谢谢!

汉诺塔问题c++递归解法相关推荐

  1. python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...

    汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...

  2. 汉诺塔python非递归实现,[Python3 练习] 006 汉诺塔2 非递归解法

    题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...

  3. 汉诺塔问题的递归和非递归算法

    汉诺塔问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 ...

  4. C语言:汉诺塔(经典递归问题)

    汉诺塔问题介绍 关于汉诺塔的传说: 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一 ...

  5. 7-5 汉诺塔的非递归实现 (25 分)

    7-5 汉诺塔的非递归实现 (25 分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b ...

  6. 7-107 汉诺塔的非递归实现 (25 分)

    7-107 汉诺塔的非递归实现 (25 分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为" ...

  7. 汉诺塔的非递归实现(借助堆栈模拟递归)

    汉诺塔的非递归实现 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n,a,b,c).即将n个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标杜( ...

  8. 汉诺塔问题的递归求解

    汉诺塔问题的递归求解 汉诺塔 解题思路 具体实现 汉诺塔 汉诺塔 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱 ...

  9. python中汉诺塔如何理解_python汉诺塔问题的递归理解

    一.问题背景 汉诺塔问题是源于印度一个古老传说. 源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下 ...

最新文章

  1. Excel问题汇总!
  2. Qt的一个颜色选取按钮QColorButton
  3. 2019日历全年一张_带上这份2019全年活动日历,旅行打卡不迷路
  4. elementui 上传七牛_element ui使用上传组件上传文件到七牛(qiniu-js)
  5. [安卓基础] 009.组件Activity详解
  6. 火热抢购(双11)双12通用海报设计素材,PSD分层!
  7. iOS8跳转到系统设置页
  8. Xshell6和Xftp6 破解免安装版(亲测可用)
  9. Ubuntu下eclipse无法识别手机驱动
  10. 对于离散行业如何选型MES系统,你知道吗?
  11. 配置计算机系统doc,计算机的基本配置.doc
  12. ​​【接口篇 / Wan】(7.0) ❀ 01. 配置 ADSL 拨号上网 ❀ FortiGate 防火墙
  13. 喜欢吃鱼的朋友一定要存哦
  14. uni.showToast appd端不起作用
  15. 关于wifi模块连接路由器远程控制的一些问题
  16. 三幅图弄懂EventBus核心原理
  17. 【BUG记录】Idea spring boot项目中target中没有同步更新最新目录文件及资源
  18. 长城会十周年:文厨用故事讲述它的“前世今生”
  19. 数据人之苦,你造吗?(转自知乎)
  20. 【半导体先进工艺制程技术系列】SOI技术(下)

热门文章

  1. vector push_back()值传递到底啥意思?
  2. 定位及优化SQL语句的性能问题
  3. axure能做剪切蒙版吗_UI设计师扔掉PS,使用Axure是怎样一种体验?
  4. 【第3版emWin教程】第53章 emWin6.x的按钮Button控件
  5. dom实现类似淘宝的星级评分
  6. ubuntu系统:插入耳机,两只耳机有一只没有声音或者声音偏小的问题
  7. C语言中printf(“%d,%d,%d“,a,++a,a++)的输出问题
  8. 文末送书 | 全面梳理总结!交通时空大数据分析、挖掘与可视化
  9. 基于ARCH模型股价波动率建模分析
  10. 如何在地图上标注,并且导入导出kmz、kml、shp等格式