汉诺塔问题c++递归解法
汉诺塔(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++递归解法相关推荐
- python堆栈汉诺塔非递归_汉诺塔问题的递归解法和非递归解法(python语言实现)...
汉诺塔问题的非递归解法(python语言类解法) #!/usr/bin/env python #coding:utf-8 import sys import time reload(sys) sys. ...
- 汉诺塔python非递归实现,[Python3 练习] 006 汉诺塔2 非递归解法
题目:汉诺塔 II 接上一篇 [Python3 练习] 005 汉诺塔1 递归解法 这次不使用递归 不限定层数 (1) 解决方式 利用"二进制" (2) 具体说明 统一起见 我把左 ...
- 汉诺塔问题的递归和非递归算法
汉诺塔问题是源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上 ...
- C语言:汉诺塔(经典递归问题)
汉诺塔问题介绍 关于汉诺塔的传说: 法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针.印度教的主神梵天在创造世界的时候,在其中一 ...
- 7-5 汉诺塔的非递归实现 (25 分)
7-5 汉诺塔的非递归实现 (25 分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为"b ...
- 7-107 汉诺塔的非递归实现 (25 分)
7-107 汉诺塔的非递归实现 (25 分) 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n, a, b, c),即将N个盘子从起始柱(标记为"a")通过借助柱(标记为" ...
- 汉诺塔的非递归实现(借助堆栈模拟递归)
汉诺塔的非递归实现 借助堆栈以非递归(循环)方式求解汉诺塔的问题(n,a,b,c).即将n个盘子从起始柱(标记为"a")通过借助柱(标记为"b")移动到目标杜( ...
- 汉诺塔问题的递归求解
汉诺塔问题的递归求解 汉诺塔 解题思路 具体实现 汉诺塔 汉诺塔 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱 ...
- python中汉诺塔如何理解_python汉诺塔问题的递归理解
一.问题背景 汉诺塔问题是源于印度一个古老传说. 源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下 ...
最新文章
- R语言使用caretEnsemble包的caretStack函数把多个机器学习模型融合成一个模型、构建融合(集成)预测模型、使用融合模型进行预测推理
- codeforces round 418 div2 补题 CF 814 A-E
- 记录运行gpu错误及解决方案
- 嵌入式入门学习笔记4:[转]什么是嵌入式底层驱动开发和嵌入式底层软件开发...
- 深度学习(十五)——SPPNet, Fast R-CNN
- [翻译]两大因素推动向上比特币价格上涨
- Python元祖,列表,字典,集合的比较
- O(n)复杂度求没有出现的数字(leetcode448)
- 17.Class Preferences
- IntelliJ IDEA 快捷键说明大全(中英对照、带图示详解)
- 软件测试基础理论知识点
- [codeforces 760B]Frodo and pillows
- Sparkplug规范-4.引用标准和资源
- 硬货专栏 |深入浅出 WebRTC AEC(声学回声消除)
- java设备未就绪_java.io.IOException: 设备未就绪
- 聚类kmeans和DBSCAN算法的简单实现
- 调用国家气象局天气接口
- 云课堂软件工程(C编码实践篇)学习之我见
- android otg读写文件,Android USB Host在USB设备OTG中读/写文件
- 深入理解SD卡:协议
热门文章
- android中api简介
- 夯实Java基础系列11:深入理解Java中的回调机制
- css flex布局下
- 我的书架20110626
- Prometheus学习系列(十五)之预警规则
- java printable_java解析电话薄 VCF文件ENCODING=QUOTED-PRINTABLE编码
- php 位深度,支撑位和阻力位的分析:究竟哪些位置可以形成阻力位和支撑位? 深度教程(图解)...
- 人脸识别考勤系统有哪些功能?嘉上物联全都有
- UE4-(光照)光照贴图大小及环境光遮蔽
- MARKETS AND MARKET LOGIC——The Market‘s Principles (6)_3