C语言:汉诺塔问题(Hanoi Tower)------递归算法
汉诺塔问题是一个经典的问题。汉诺塔(Hanoi Tower),又称河内塔,源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。
(忍不住调侃一下,难怪印度神片能这么有“内味”)
#######最后会附上源代码#######
先声明一下,我们之间约定三根柱子分别为:X Y Z,
先来一个快餐规律:
刚开始在XY柱上 现在只有X柱有盘子
X柱上 除了最底下的盘子, 都移动到Y柱, 然后就可以让最底层的盘子安心移动到Z柱
(在XY柱上 现在只有Y柱上有盘子)
Y柱上 除了最底层的盘子, 都移动到X柱,然后就可以让最底层的盘子安心移动到Z柱
(在XY柱上 现在只有X 柱上有盘子)
嗨害,你看,在XY柱上 现在只有X柱上有盘子,回到了我们刚开始的那一步
并且我们每一次移动都保证最底下的,也就是保持着大的盘子在下面,小的在上面
那么现在来认真讲解一下细节,复杂的程序,让我们化繁为简,从三个盘子开始做起! 请认真看完。
1
2
3
X Y Z
首先你先从最简单的三个盘子开始移动,我们读完题目肯定都知道,
第一步:把除了最底层的盘子,X柱上的盘子都移动到Y上面,以便于X底层的盘子移动到Z上
肯定是先把X柱子最上面那个盘子移动到Z上,
2
3 1
X Y Z
然后把第二个盘子移动到Y上
3 2 1
X Y Z
然后第一个盘子已经在Z上了,现在把他移动到Y上面,也就是第二个盘子上面
1
3 2
X Y Z
然后现在可以直接把X上最大的盘子3,移动到Z上面
1
2 3
X Y Z
第二步:把除了最底层的盘子,Y柱上的盘子都移动到X上面,以便于Y底层的盘子移动到Z上
现在把1号盘子移动到X上
1 2 3
X Y Z
然后最Y底层的就是2号盘子,移动到Z上
2
1 3
X Y Z
最后那肯定是把X上面那个小兔崽1号盘子移动到Z上了,
1
2
3
X Y Z
完成任务~
相信理解了上面之后你们就会编码了,我这个仅供参考:
#include<stdio.h>
void hanoi(int, char, char, char); //打印出移动步骤
int main()
{
//汉诺塔游戏
int n;
printf("请输入你要移动多少个汉诺塔:");
scanf("%d", &n);
printf("你需要按照下面步骤来移动:\n");
hanoi(n, 'X', 'Y', 'Z');
return 0;
}
void hanoi(int n, char x, char y, char z)
{
if(n == 1)//递归结束条件,每个递归都要有这个结束条件,看程序要求而定条件内容
{
printf("%c--->%c\n", x, z);
//n等于一的时候就是移动到最后那一步了,也就是递归的结束条件
}
else
{
hanoi(n-1, x, z, y);//除了底层的盘子 把X上的全部移动到Y, 所以是n-1
printf("%c--->%c\n", x, z);
hanoi(n-1, y, x, z);//除了底层的盘子 把Y上的全部移动到Z, 所以是n-1
}
}
C语言:汉诺塔问题(Hanoi Tower)------递归算法的更多相关文章
- 算法:汉诺塔问题(Tower of Brahma puzzle)
一.算法背景 最早发明这个问题的人是法国数学家爱德华·卢卡斯.传说越南河内某间寺院有三根银棒(A, B, C),上串 64 个金盘. 寺院里的僧侣依照一个古老的预言,以上述规则移动这些盘子:预言说当这 ...
- 汉诺塔问题(The Tower of Hanoi)的递归算法与非递归算法
非递归算法: 根据圆盘的数量确定柱子的排放顺序: 若n为偶数,按顺时针方向依次摆放 A B C: 若n为奇数,按顺时针方向依次摆放 A C B. 然后进行如下操作: (1)按顺时针方向把圆盘1从现在的 ...
- JavaScript算法实现之汉诺塔(Hanoi)
目前前端新手,看到的不喜勿喷,还望大神指教. 随着Node.js,Angular.js,JQuery的流行,点燃了我学习JavaScript的热情!以后打算每天早上跟晚上抽2小时左右时间将经典的算法都 ...
- [js - 算法可视化] 汉诺塔(Hanoi)演示程序
前段时间偶然看到有个日本人很早之前写了js的多种排序程序,使用js+html实现的排序动画,效果非常好. 受此启发,我决定写几个js的算法动画,第一个就用汉诺塔. 演示地址:http://tut.ap ...
- C语言数据结构----递归的应用(斐波拉契数列、汉诺塔、strlen的递归算法)
本节主要说了递归的设计和算法实现,以及递归的基本例程斐波拉契数列.strlen的递归解法.汉诺塔和全排列递归算法. 一.递归的设计和实现 1.递归从实质上是一种数学的解决问题的思维,是一种分而治之的思 ...
- C语言 汉诺塔问题
//凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 汉诺塔是由三根杆子A,B,C组成的.A杆上有n个(n>1)穿孔圆盘,盘的尺寸由下到上依次变小.要求按 ...
- 汉诺塔(hanoi)
汉诺塔代码: def hanoi(n,x,y,z): if n == 1: print(x,'-->',z) else: hanoi(n-1,x,z,y) print(x,'-->',z) ...
- C#递归解决汉诺塔问题(Hanoi)
using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace MyExamp ...
- c语言-汉诺塔递归调用
#include<stdio.h> int main() { void hano_tower(int n,char one,char two,char three); int m=0; p ...
- 汉诺塔 Hanoi Tower
电影<猩球崛起>刚开始的时候,年轻的Caesar在玩一种很有意思的游戏,就是汉诺塔...... 汉诺塔源自一个古老的印度传说:在世界的中心贝拿勒斯的圣庙里,一块黄铜板上插着三支宝石针.印度 ...
随机推荐
- #虚树,树形dp#CF613D Kingdom and its Cities
洛谷题面 Codeforces 分析 若两个重要城市为一条边的两个顶点显然无解 否则考虑建一棵虚树,设\(dp[x]\)表示以\(x\)为根的子树最少需要摧毁的城市数, 令\(Siz[x]\)表示\( ...
- 使用OHOS SDK构建libwebp
参照OHOS IDE和SDK的安装方法配置好开发环境. 从github下载源码. 执行如下命令: git clone --depth=1 https://github.com/webmproject/ ...
- FreeMarker 去除循环末尾的符号
在使用 FreeMarker 模板引擎来生成文件时,经常会使用到 list 标签用于循环生成. 有时会遇到需要处理末尾符号的情况,比如 Json 文件,循环生成的标签中末尾是不需要 , 的,例如: & ...
- 【版本发布公告】HMS Core6.5.0来啦
新 能 力 3D Engine 3D Engine提供高性能.高画质.高扩展性的实时3D引擎,并提供便捷高效的可视化开发工具.开发者可基于华为的3D Studio开发工具,通过图形和渲染.动画.UI等 ...
- JS从图片base64数据中获取图片的宽高
// js从base64数据中获取宽高 var image = new Image(); image.src = "data:image/png;base64," + base64 ...
- MyBatis 应用的组成
王有志,一个分享硬核Java技术的互金摸鱼侠 加入Java人的提桶跑路群:共同富裕的Java人 大家好,我是王有志.在上一篇文章的最后,我们写了一个简单的例子,今天我们就通过这个例子来看一看一个标准的 ...
- 整理k8s————k8s prod相关[三]
前言 简单整理k8s prod. 正文 prod 有两种: 自主式prod 控制器管理的prod 在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod,Pod是最小的,管理,创建, ...
- js 闭包(新)
前言 旧的没有搬过来,先写一下新的感悟. 正文 ECMAScript中,闭包指的是: 从理论角度:所有的函数.因为它们都在创建的时候就将上层上下文的数据保存起来了.哪怕是简单的全局变量也是如此,因为函 ...
- jenkins 持续集成和交付——开篇(一)
前言 因为以前就很想看下jenkins了,平时工作中也使用,主要是写脚本,但是jenkins 主要还是说运维部门来搞定的,因为公司安全部门认为程序员不应该去接触运维的东西,但是上次面试问了下,准备把这 ...
- 宏杉科技加入阿里云PolarDB开源数据库社区
简介: 宏杉科技签署阿里巴巴开源CLA(Contribution License Agreement, 贡献许可协议), 正式与阿里云PolarDB 开源数据库社区牵手. 宏杉科技签署阿里巴巴开源CL ...