Hanoi塔

2017年07月29日
由《数据结构》(c语言版)【严蔚敏  吴伟民 编著】
page54- page58 启发得到:
根据递归原理。
当n=1时,只需移动1次。
当n=2时,需要移动3次。
当n=3时。可以利用上题结论。经过我在公交车上的思考,可以得到递推公式。
本次增加一层所需的移动量,是之前(增加一层之前)的所需的移动量的2倍,还没完,再加上1。
这个使用语言表达起来还真有点繁琐。公式表达如下:
(目前不知道怎么利用latex等编辑器的方式输入公式)
最后可以得到当为n时的所需的移动次数的公式,结果看起来是很简单的。
2^n - 1
在Wikipedia中竟然发现了对该问题的详细的解答。和我的想法一致。
参考链接如下:
https://en.wikipedia.org/wiki/Tower_of_Hanoi
以上推理过程用到了高中数学中的数列知识。

时间: 2024-10-06 01:25:44

Hanoi塔的相关文章

栈和递归之Hanoi塔

hanoi塔 代码 <pre name="code" class="cpp">#include<stdio.h> void move(char x,int n,char y) { static int k=1; printf("Step %d : %d from %c >>->> to %c \n",k++,n,x,y); } void hanoi(int n,char A,char B,char

用递归实现 hanoi塔

// hanoi.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" void move(int n,char moveStart,char moveEnd){ printf("move %d from %c to %c\n",n,moveStart,moveEnd); } void hanoi(int n,char moveStart,char moveTemp,char moveEnd){ if (n == 1) { move

n阶Hanoi塔问题

假设有三个命名为x.y.z的塔座,在塔座x上插有n个直径大小各不相同.依小到大编号为1.2...n的圆盘,要求将x塔座上的n个圆盘移至z上,并仍按同样的顺序叠排,圆盘移动时应遵守下列规则: (1)每次只能移动一个圆盘: (2)圆盘可插在x.y和z中任何一个塔座上: (3)任何时刻都不能将一个较大的圆盘压在较小的圆盘上面. 如下图所示为3阶Hanoi塔问题的初始状态. 完整代码: 1 #include <stdio.h> 2 3 void Hanoi(int n, char x, char y,

POJ1958 Strange Towers of Hanoi --- 递推【n盘m塔Hanoi塔问题】

POJ1958 Strange Towers of Hanoi Sol: n盘4塔问题可以分为3步: 1.以4塔模式移走i个盘. 2.以3塔模式将剩余n-i个盘移至第4塔. 3.以4塔模式将第一步中的i个盘移至第4塔. 我们用\(d[i]\)表示在3塔模式下移i个盘的最小步数,\(f[i]\)表示在4塔模式下移i个盘的最小步数. 递推式:\(f[i]=\min_{1\leq j < i}(2*f[j]+d[i-j])\) EX 本题可以拓展至n盘m塔问题. \(f[i][j]\)表示在i塔模式下

Demo:Hanoi塔问题到底是如何运行的?

Hanoi问题以递归移动柱上碟子的方法解决问题,但各柱上碟片的变化到底是如何变化的? 下面的程序给出了演示效果,便于程序员理解. #include <stdio.h> #define N 6 int Vals[3][N+1]; int movecnt = 0; void out() { for(int i = 0; i < 3; i++) { for(int j = 1; j <= N; j++) if (j <= Vals[i][0]) printf("%d &q

Hanoi塔问题

传说在古代印度的贝拿勒斯圣庙里,安放了一块黄铜板,板上插了三根宝石柱(不妨设A.B.C柱),在A宝石柱上,自上而下按由小到大的顺序串有64个金盘.要求将A柱子上的64个金盘按照下面的规则移到C柱上. 规则: ①一次只能移一个盘子: ②盘子只能在三个柱子上存放: ③任何时候大盘不能放在小盘上面. 任务:输入正整数n(A柱上的盘子数),输出移动到C柱上的移动过程. 分析 :设A上有n个盘子. 1. n=1时,则将圆盘从A直接移动到C. 2. n=2时,则: ①将A上的1个圆盘移到B上: ②再将A上的

Hanoi塔问题(递归)

#include<iostream> #include<cstdio> using namespace std; int sum; int f(int n,char a,char b,char c){ if(n == 1){printf("1 from a to b\n");sum++;return sum;} else { f(n-1,a,c,b); printf("%d from %c to %c\n",n,a,c);sum++; f(n

完成喽,以后玩hanoi塔各级作弊咯!

#include<stdio.h>// -------------------------- void h(int n,char a,char b,char c )// | {// | if(n==1)// | printf("%c->%c\n",a,c);// |子 else// |函 {// |数 h(n-1,a,c,b);// | printf("%c->%c\n",a,c);/// | h(n-1,b,a,c);// | }// --

用函数递归的方法解决古印度汉诺塔hanoi问题

问题源于印度一个古老传说的益智玩具.大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘.大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上.并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘. 我们把柱子依次命名为A,B,C 从只有一个圆盘考虑:直接就是A-->C 两个圆盘的时候就是:A-->B,A-->C,B-->C 三个圆盘的时候就是:A-->C,A-->B,C-->B,A-->C,