时间:2021-05-20
汉诺塔详解
以4层为例
以下为我的拙见,还希望大佬雅正
要把汉诺塔移动到c 需要把1,2,3层移到b 把4移动到c 在吧123移动到b
但是一次只能动一块 所以我们目前要做的就是把上面三块移动到b
那就需要把1 2移动到c
由此我们可以推出要把1,2移动到c,只需要把1移动到b
这里我们发现有很多重复的自相似动作
我们就可以设计递归 递归需要1,递归体 2 出口。
递归体
移动n-1个盘子和1个盘子和n个盘子过程都是相似的
但是每次放入的杆子不一样。
出口
n=1时只剩一个盘子,直接移动到c即可
hanoi(n ,A , B , C)
N 移动数量
A 出发地
B 借助地
C 终点
这个函数的意思就是有n个盘子从A出发借助B来到C
现在有n层汉诺塔 就需要把上面n-1层移动到B
hanoi(n-1,A,C,B)
这个函数就是我们要把n-1个盘子从A借助C移动到B
move(a,c)现在不需要再借助了 可以直接从a移动到c
接下来我们就要借助A吧剩下n-1个盘子移动到C了
hanoi(n-1,B,A,C)即可完成
递归出口
n<=1
在这里插入代码片```// 汉诺塔问题//输出移动的步骤 #include <stdio.h>//记录步数 int i = 1;//n 第几号盘移动, from 移动塔 to 目标塔 void move(int n, char from, char to) { printf("第%d次移动第%d号盘: %c----->%c\n", i++, n, from, to);}void hanoi(int n, char from, char mid, char to) { if (n == 1) { move(n, from, to);//只有一个盘子是直接将初塔上的盘子移动到目的地 }//函数出口 else { hanoi(n - 1, from, to, mid);//先将初始塔的前n-1个盘子借助目的塔移动到借用塔上 move(n, from, to); //将剩下的一个盘子移动到目的塔上 hanoi(n - 1, mid, from, to);//最后将借用塔上的n-1个盘子移动到目的塔上 }}int main() { printf("请输入盘子的个数:\n"); int n; scanf_s("%d", &n); char x = 'A', y = 'B', z = 'C'; printf("盘子移动情况如下:\n"); hanoi(n, x, y, z); return 0;}总结
到此这篇关于C语言汉诺塔的文章就介绍到这了,更多相关C语言汉诺塔内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
汉诺塔问题是学习递归的入门问题,这里用C#简单实现了一个汉诺塔之间传递盘子的小程序通过简单绘图实现盘子在几个塔之间的转换:namespace汉诺塔{//盘子类c
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。下面是c#实现汉诺塔示例复制代码代码如下:usingSystem;usingSystem.Co
本文实例为大家分享了python实现汉诺塔游戏的具体代码,供大家参考,具体内容如下一.汉诺塔汉诺塔问题是一个经典的递归问题,对于这个问题,我们可以把它简单的去看
学习python遇到的第一个问题:汉诺塔问题的实现。首先是不知道什么是汉诺塔问题,然后是不知道怎么实现。于是百度了下,结果如下:汉诺塔:汉诺塔(又称河内塔)问题
本文所述为汉诺塔算法的C++代码的经典实现方法。汉诺塔问题描述:3个柱为a、b、c,圆盘最初在a柱,借助b柱移到c柱。需要你指定圆盘数。具体实现代码如下:#in