面试常考算法题(七)-汉诺塔问题

合集下载

汉诺塔的递归算法

汉诺塔的递归算法

汉诺塔的递归算法1. 汉诺塔问题简介汉诺塔是一种经典的递归问题,常用于理解和展示递归算法的思想。

该问题由法国数学家爱德华·卢卡斯于19世纪初提出,得名于印度传说中一个传说故事。

现代汉诺塔问题由3个塔座和一些盘子组成,目标是将所有盘子从一个塔座上移动到另一个塔座上,遵循以下规则:1.一次只能移动一个盘子;2.大盘子不能放在小盘子上面。

2. 汉诺塔问题的递归解法汉诺塔问题的递归解法是一种简洁、优雅且高效的解决方案。

递归算法是一种将大问题划分为更小子问题的方法,通过递归地解决子问题来解决整个问题。

2.1. 基本思想以三个塔座A、B、C为例,假设有n个盘子需要从A移动到C。

递归算法的基本思想如下:1.将n个盘子分成两部分:最底下的一个盘子和上面的n-1个盘子;2.将上面的n-1个盘子从塔座A移动到塔座B,目标塔座为C;3.将最底下的一个盘子从塔座A移动到塔座C;4.将塔座B上的n-1个盘子移动到塔座C,目标塔座为A。

2.2. 递归实现递归解决汉诺塔问题的关键在于理解递归的调用和返回过程。

具体的递归实现如下:def hanoi(n, a, b, c):# n表示盘子的数量,a、b、c表示3个塔座if n == 1:print("Move disk from", a, "to", c)else:hanoi(n-1, a, c, b)print("Move disk from", a, "to", c)hanoi(n-1, b, a, c)# 调用递归函数hanoi(3, 'A', 'B', 'C')上述代码中,当n等于1时,直接将盘子从塔座A移动到塔座C。

否则,递归地将上面的n-1个盘子从塔座A移动到塔座B,然后将最底下的一个盘子从A移动到C,最后再将塔座B上的n-1个盘子移动到塔座C。

汉诺塔问题

汉诺塔问题

盐城工学院C++课程设计二级学院:信息学院班级:姓名:学号:指导老师:1.报告简介1.1 汉诺塔问题简介在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。

印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔(如下图)。

不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必在大片上面。

当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,梵塔、庙宇和众生都将同归于尽。

故汉诺塔问题又被称为“世界末日问题。

”图1-11.2 问题思想解决为满足题目中盘子的移动问题,必须遵循的条件是:一次仅能移动一个盘,且不允许大盘放在小盘的上面。

设要解决的汉诺塔共有N个圆盘,对A杆上的全部N个圆盘从小到大顺序编号,最小的圆盘为1号,次之为2号,依次类推,则最下面的圆盘的编号为N。

第一步:先将问题简化。

假设A杆上只有一个圆盘,即汉诺塔只有一层N,则只要将1号盘从A杆上移到B杆上即可。

第二步:对于一个有N(N>1)个圆盘的汉诺塔,将N个圆盘分成两部分:“上面的N-1个圆盘”看成一个整体,为了解决N个圆盘的汉诺塔,可以按下面图示的方式进行操作:(1)将A杆上面的N-1个盘子,借助B杆,移到C杆上;图1-2(2)将A杆上剩余的N号盘子移到B杆上;图1-3(3)将C杆上的N-1个盘子,借助A杆,移到B杆上。

图 1-41.3 预期目标运行程序后,首先显示:图 1-5选择 1 后,要求输入盘子的数目,即N输入后,显示递归调用时盘子移动的过程图 1-6继续选择 2 ,要求输入盘子的数目,即P输入后,显示非递归调用时盘子移动过程。

图 1-72.需求分析编写汉诺塔程序用到的知识有:符号常量的定义,循环语句,函数,栈与应用;2.1 符号常量的定义常量就是在程序运行过程中其值不发生变化的量。

汉诺塔问题的详解课件

汉诺塔问题的详解课件
计算,提高算法的效率。但是,对于较大 的n值,动态规划解法的空间复杂度较高,需要较大的存储空间。
03 汉诺塔问题的变 种和扩展
多层汉诺塔问题
01
02
03
定义
多层汉诺塔问题是指将多 层的盘子从一个柱子移动 到另一个柱子,同时满足 汉诺塔问题的规则。
难度
随着盘子层数的增加,解 决问题的难度呈指数级增 长。
子从中间柱子移动到目标柱子。
递归解法的优点是思路简单明了,易于 理解。但是,对于较大的n值,递归解 法的时间复杂度较高,容易造成栈溢出

分治策略
分治策略是解决汉诺塔问题的另一种方法。它将问题分解为若干个子问题,分别求解这些子 问题,然后将子问题的解合并起来得到原问题的解。
分治策略的基本思路是将汉诺塔问题分解为三个阶段:预处理阶段、递归转移阶段和合并阶 段。预处理阶段将n-1个盘子从起始柱子移动到中间柱子,递归转移阶段将第n个盘子从起 始柱子移动到目标柱子,合并阶段将n-1个盘子从中间柱子移动到目标柱子。
制作汉诺塔问题的动画演示
除了使用Python或数学软件进行可视化演示外,还可以使 用动画制作软件来制作汉诺塔问题的动画演示。这些软件 提供了丰富的动画效果和编辑工具,可以创建生动有趣的 演示。
在动画演示中,可以使用不同的颜色和形状来表示不同的 柱子和盘子。通过添加音效和文字说明,可以增强演示的 视觉效果和互动性。最终的动画演示可以保存为视频文件 ,并在任何支持视频播放的设备上播放。
使用Python的图形库,如matplotlib或tkinter,可以创建汉诺塔的动态演示。 通过在屏幕上绘制柱子和盘子,并模拟移动过程,可以直观地展示汉诺塔问题的 解决方案。
Python代码可以编写一个函数来模拟移动盘子的过程,并在屏幕上实时更新盘 子的位置。通过递归调用该函数,可以逐步展示移动盘子的步骤,直到所有盘子 被成功移动到目标柱子上。

汉诺塔问题算法

汉诺塔问题算法

汉诺塔问题算法汉诺塔问题是一个经典的数学问题和递归算法问题。

在汉诺塔问题中,有三个柱子,分别称为A、B、C,有一组大小不同的圆盘,开始时,这些圆盘都堆叠在A柱子上,目标是将所有的圆盘从A柱子移动到C柱子上,期间可以借助B柱子。

以下是汉诺塔问题的算法实现:1.如果只有一个圆盘,直接将其移动到C柱子上。

2.如果有多个圆盘(n个),先将上面的n1个圆盘从A柱子移动到B柱子上。

a.将上面的n1个圆盘从A柱子移动到C柱子,此时B柱子作为辅助柱子。

b.将最下面的第n个圆盘从A柱子移动到C柱子。

3.最后将B柱子作为起始柱子,A柱子作为辅助柱子,将B 柱子上的n1个圆盘移动到C柱子上。

实现递归函数hanoi(n,start,aux,end):如果n=1,直接将start柱子上的圆盘移动到end柱子上。

否则,将上面的n1个圆盘从start柱子移动到aux柱子。

调用递归函数hanoi(n1,start,end,aux),将start柱子上的n1个圆盘移动到aux柱子上。

将第n个圆盘从start柱子移动到end柱子上。

调用递归函数hanoi(n1,aux,start,end),将aux柱子上的n1个圆盘移动到end柱子上。

调用递归函数hanoi(n,'A','B','C')可以解决汉诺塔问题,其中n表示圆盘的数量,'A'、'B'、'C'表示三个柱子。

以上是汉诺塔问题的基本算法。

通过递归调用,可以有效地解决汉诺塔问题,但是当圆盘数量较大时,计算量会变得非常大。

因此,在实际应用中需要考虑到算法的优化和效率问题。

22道数据结构算法面试题

22道数据结构算法面试题

微软的22道数据结构算法面试题(含答案)1、反转一个链表。

循环算法。

1 List reverse(List l) {2 if(!l) return l;3 list cur = l.next;4 list pre = l;5 list tmp;6 pre.next = null;7 while ( cur ) {8 tmp = cur;9 cur = cur.next;10 tmp.next = pre;11 pre = tmp;12 }13 return tmp;14 }2、反转一个链表。

递归算法。

1 List resverse(list l) {2 if(!l || !l.next) return l;34 List n = reverse(l.next);5 l.next.next = l;6 l.next=null;7 }8 return n;9 }3、广度优先遍历二叉树。

1 void BST(Tree t) {2 Queue q = new Queue();3 q.enque(t);4 Tree t = q.deque();5 while(t) {6 System.out.println(t.value);7 q.enque(t.left);9 t = q.deque();10 }11 }----------------------1class Node {2 Tree t;3 Node next;4 }5class Queue {6 Node head;7 Node tail;8 public void enque(Tree t){9 Node n = new Node();10 n.t = t;11 if(!tail){12 tail = head = n;13 } else {14 tail.next = n;15 tail = n;16 }17 }18 public Tree deque() {19 if (!head) {20 return null;21 } else {22 Node n = head;23 head = head.next;24 return n.t;25 }26}4、输出一个字符串所有排列。

汉诺塔问题数学解法

汉诺塔问题数学解法

汉诺塔问题数学解法
一、建立递归模型
汉诺塔问题是一个经典的递归问题,可以通过建立递归模型来求解。

递归模型的基本思想是将问题分解为更小的子问题,然后通过对子问题的求解来得到原问题的解。

二、定义变量
在汉诺塔问题中,我们可以定义以下变量:
n:表示盘子的数量;
A、B、C:表示三个柱子,其中A柱子是起始柱子,B 柱子是辅助柱子,C柱子是目标柱子;
m:表示当前需要移动的盘子数量。

三、递归关系
汉诺塔问题的递归关系可以表示为:
将m个盘子从A移动到C,需要先将m-1个盘子从A移动到B,然后将最后一个盘子从A移动到C,最后将m-1个盘子从B移动到C。

将m个盘子从A移动到B,需要先将m-1个盘子从A移动到C,然后将最后一个盘子从A移动到B,最后将m-1个盘子从C移动到B。

将m个盘子从B移动到C,需要先将m-1个盘子从B移动到A,然后将最后一个盘子从B移动到C,最后将m-1个盘子从A移动到C。

四、寻找规律
通过观察递归关系,我们可以发现以下规律:
每次移动都需要经过三个柱子,即起始柱子、辅助柱子和目标柱子;
每次移动都需要将n-1个盘子从起始柱子移动到辅助柱子,然后将最后一个盘子从起始柱子移动到目标柱子,最后将n-1个盘子从辅助柱子移动到目标柱子;
每次移动都需要将n-1个盘子从起始柱子移动到辅助柱子,然后将最后一个盘子从起始柱子移动到目标柱子,最后将n-1个盘子从辅助柱子移动到目标柱子。

五、验证解决方案
通过以上规律,我们可以得到汉诺塔问题的解法。

为了验证解法的正确性,我们可以使用递归函数来实现解法,并使用测试数据来验证解法的正确性。

汉诺塔递归算法及详解

汉诺塔递归算法及详解

汉诺塔递归算法及详解
汉诺塔(Tower of Hanoi)是一个经典的数学谜题和递归问题。

它由三个塔杆和一些不同大小的圆盘组成,开始时圆盘按从大到小的顺序叠放在一个塔杆上。

目标是将所有圆盘从起始塔杆移动到目标塔杆上,同时遵守以下规则:
1. 一次只能移动一个圆盘。

2. 任何时刻,大的圆盘不能放在小的圆盘上面。

递归算法是解决汉诺塔问题的常用方法。

其基本思想是将问题分解为较小规模的子问题,然后通过递归地解决子问题来解决原问题。

以下是汉诺塔递归算法的详解:
1. 如果只有一个圆盘需要移动,则直接将圆盘从起始塔杆移动到目标塔杆上。

2. 如果有多个圆盘需要移动,则按以下步骤进行操作:
- 将除最下方的圆盘以外的上方圆盘从起始塔杆移动到辅助塔杆上。

这可以通过递归调用解决较小规模的子问题来实现,即将上方圆盘从起始塔杆移动到目标塔杆上(目标塔杆作为新的辅助塔杆)。

- 然后将最下方的圆盘从起始塔杆直接移动到目标塔杆上。

- 最后,将辅助塔杆上的所有圆盘移动到目标塔杆上,这可以通过递归调用解决较小规模的子问题来实现,即将上方圆盘从辅助塔杆移动到起始塔杆上(起始塔杆作为新的目标塔杆)。

通过递归地应用以上步骤,就可以实现将所有圆盘从起始塔杆移动到目标塔杆上的操作。

汉诺塔问题

汉诺塔问题

第3 时汉诺塔问题首先介绍下汉洛塔问题,就是说有三根杆分别标记为A、B、C,在在A杆自下而上、由大到小按顺序放置n个盘。

目标是把A杆上的盘全部移到C杆上,并依旧保持顺序叠好。

移动的规则:每次只能移动一个盘子,并且在移动过程中三根杆上始终保持大盘在下,小盘在上,操作过程中盘子可以至于A、B、C任一杆上。

来分析一下如果有N个盘子当n=1即只有一个盘子,那么直接将1号盘子移动到c杆上即可;当n=2即a杆上有两个盘子,则需要分为三步,1移到B,2移到C,1移到C 当n=1和n=2的时候,我们可以很轻易的完成移动。

那么当n=n的时候,就把n个盘子分为两个部分,第一个部分就是顶上的n-1个小盘,第二部分是最底下的大盘,分成两个部分之后,我们就把塔看作两个盘子,那么只要三步就可以完成移动。

第一步要把n-1个盘子移动到B杆上,那么如何把着n-1个盘子移动到B杆上呢,当A移动到C时B作为中介杆,现在要把A 上的N-1盘移动到B 杆了,那么就应该交换杆的作用,C杆变成了中介杆,A杆变成了原始干B变成了目标杆,通过交换杆的作用,完成将A上n-1个盘子移动到B杆上的目的,在代码上来看就是直接交换B和C的位置,完成了把n-1个盘子移动到B杆上,第二步就是把a上最底下的N号盘子移动到C杆上。

最后一部就是把B杆上的N-1个盘子移动到C 上,这时就可以借助A杆,把Aa杆看作中介杆,B为原始杆,C为目标杆。

就可以完成移动。

在代码上就是B放在函数第一位,A放在第二位,C放在最后位,于是通过简单的3步就可以完成这个题,递归方法的思路就相对于简单些,接下来分析下他的时间复杂度,他的时间函数为:当n=1时,时间函数为1,当汉诺塔规模为n时,时间函数为T(n),这里调用汉诺塔函数规模为n-1他的时间复杂度为T(n-1)这里时一个输出函数语句他的时间函数为1,他的时间也复杂度为T(n-1)下面也是一个汉诺塔函数规模也为n-1,s所以他的时间函数为两倍的T(n-1)+1解决方式•首先将n 片金片从小到大依次编号为0 号、1 号、……、n-1 号假设有一个4 层高的汉诺塔,设初始值为0000按"8"、"4"、"2"、"1" 称呼二进制的各位"8"位、"4"位、"2"位、"1"位依次对应3 号金片、2 号金片、1号金片、0 号金片开始累加,每次加10000(2) -> 0001(2)"1"位由0 变1,则将0 号金片右移,即将0 号金片由A 塔移至B塔除了DFS,还有BFS,从概念上讲,两者只是在扩展时的方向不同,DFS向深扩张,而BFS向广扩张。

汉诺塔问题非递归算法c语言

汉诺塔问题非递归算法c语言

汉诺塔问题非递归算法c语言汉诺塔问题是一个经典的数学问题,也是一个常见的编程练习题。

在这个问题中,有三根柱子和一些圆盘,圆盘的大小不一,从小到大依次叠放在一根柱子上。

目标是将所有的圆盘从一根柱子移动到另一根柱子,移动过程中要保证大的圆盘在小的圆盘上面。

同时,每次只能移动一个圆盘,且不能把一个大的圆盘放在一个小的圆盘上面。

在解决汉诺塔问题时,通常采用递归算法。

但是递归算法的效率并不高,因为每次递归都会产生额外的函数调用,增加了系统的开销。

因此,我们可以通过非递归的方式来解决汉诺塔问题,提高算法的效率。

以下是一个用C语言实现的汉诺塔问题的非递归算法:```c#include <stdio.h>#include <stdlib.h>typedef struct {int n;char start, end, temp;} StackNode;typedef struct {StackNode data[100];int top;} Stack;void push(Stack *s, StackNode node) {s->data[s->top++] = node;}StackNode pop(Stack *s) {return s->data[--s->top];}void hanoi(int n, char start, char end, char temp) {Stack s;s.top = 0;StackNode node;node.n = n;node.start = start;node.end = end;node.temp = temp;push(&s, node);while (s.top > 0) {node = pop(&s);if (node.n == 1) {printf("Move disk 1 from %c to %c\n", node.start, node.end); } else {StackNode node1, node2, node3;node1.n = node.n - 1;node1.start = node.temp;node1.end = node.end;node1.temp = node.start;push(&s, node1);node2.n = 1;node2.start = node.start;node2.end = node.end;node2.temp = node.temp;push(&s, node2);node3.n = node.n - 1;node3.start = node.start;node3.end = node.end;node3.temp = node.temp;push(&s, node3);}}}int main() {int n;printf("Enter the number of disks: "); scanf("%d", &n);hanoi(n, 'A', 'C', 'B');return 0;}```在这个非递归算法中,我们使用了一个栈来模拟递归的过程。

【算法】汉诺塔问题

【算法】汉诺塔问题

【算法】汉诺塔问题汉诺塔问题是⼀个经典的问题。

汉诺塔(Hanoi Tower),⼜称河内塔,源于印度⼀个古⽼传说。

⼤梵天创造世界的时候做了三根⾦刚⽯柱⼦,在⼀根柱⼦上从下往上按照⼤⼩顺序摞着64⽚黄⾦圆盘。

⼤梵天命令婆罗门把圆盘从下⾯开始按⼤⼩顺序重新摆放在另⼀根柱⼦上。

并且规定,任何时候,在⼩圆盘上都不能放⼤圆盘,且在三根柱⼦之间⼀次只能移动⼀个圆盘。

问应该如何操作?当只有⼀个盘⼦时这是最简单的情况:只需将1号盘⼦从X塔移动到Z塔就OK于是我们可以写出如下的函数,来模拟完成这个过程。

假设盘⼦是⽤1,2,3...按照⼤⼩编码代表的,⽽塔则是⽤⼀个字符char表⽰的。

//将编号为 number 的盘⼦从 from 塔座移到 to 塔座void move(int number , char from , char to){std::cout<<"move dish "<<number<<": "<<from<<"--->"<<to<<std::endl;}有两个盘⼦时有2个盘⼦,⽬标是:将X塔上的盘⼦借助Y移动到Z盘⼦上。

特别的,为了好描述,我把X塔叫做源塔,因为盘⼦起初在这个塔上,把Y塔叫做辅助塔,因为Y塔只是起个过渡作⽤。

把Z盘叫做⽬标塔,最后所以的盘⼦都在这个塔上。

我们可以写出伪代码move(1,X,Y);move(2,X,Z);move(1,Y,Z);有三个盘⼦时在盘⼦数⼤于2的时候,⽆论有多少个盘⼦,我们眼⾥只有2个盘⼦:即最底层的最⼤的盘⼦,和它上⾯的所有盘⼦组和形成的⼀个盘,我们可以把它看做是2.5号盘。

这样考虑的好处是:⽆论有多少盘⼦,都可以⽤2个盘⼦的思路去做。

简化了思路。

因此,步骤是:1、将2.5号盘借助Z塔移动到Y塔上。

注意,处理这步操作时,X是源塔,Z是辅助塔,Y是⽬标塔2、将3盘移动到Z塔上,3、将2.5盘借助X塔移动到Z塔上。

汉诺塔问题通项公式

汉诺塔问题通项公式

汉诺塔问题通项公式
汉诺塔问题家传户晓,其问题背景不做详述,此处重点讲解在有3根柱子的情况下,汉诺塔问题求解的通项公式的推导。

问题背景:有A,B和C三根柱子,开始时n个大小互异的圆盘从小到大叠放在A柱上,现要将所有圆盘从A移到C,在移动过程中始终保持小盘在大盘之上。

求移动盘子次数的最小值。

变量设置:n为圆盘个数,H(k)为n=k时移动盘子次数的最小值。

递推公式: H(k)=2H(k-1)+1。

通项公式:H(k)=2^k-1。

证明:
(1)证明递推公式:首先被移动到C盘的必定是最大的盘子,否则必定违反“在移动过程中始终保持小盘在大盘之上”的规定。

既然要将最大盘移动到C,此时最大盘之上必定没有任何盘子,亦即它独自在一根柱子上,要做到这点最优做法当然是先把较小的n-1个盘子由A移动到B,剩下最大盘独自在A。

将n-1个盘由A移动到B花费的最少次数为H(n-1)。

此时再将最大盘由A移动到C,此时移动总次数为H(n-1)+1。

接着把剩下的n-1个盘由B移动到C,花费的最少次数当然也是H(n-1)。

于是得到总移动次数2H(n-1)+1.证得H(k)=2H(k-1)+1。

(2)推导通项公式。

由H(k)=2H(k-1)+1得H(k)+1=2(H(k-1)+1),于是{H(k)+1}是首项为H(1)=1,公比为2的等比数列,求得H(k)+1 =
2^k,所以H(k) = 2^k-1。

汉诺塔问题

汉诺塔问题

汉诺塔百科名片汉诺塔初始状态汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。

上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。

上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

目录由来汉诺塔与宇宙寿命concreteHAM:汉诺塔问题的程序实现由来汉诺塔与宇宙寿命concreteHAM:汉诺塔问题的程序实现展开编辑本段由来来源汉诺塔是源自印度神话里的玩具。

上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。

上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

传说在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。

印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。

不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。

僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。

这需要多少次移动呢?这里需要递归的方法。

假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。

此后不难证明f(n)=2^n-1。

n=64时,f(64)= 2^64-1=18446744073709551615假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下,18446744073709551615/31556952=584554049253.855年这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。

汉诺塔问题

汉诺塔问题

汉诺塔问题
汉诺塔问题是使用递归解决问题的经典范例。

汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A、B、C,A座上有64个盘子,盘子大小不等,大的在下,小的在上(如图)。

有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动一个盘子,并且在移动过程中,3个座上的盘子始终保持大盘在下,小盘在上。

在移动过程中可以利用B座,要求打印移动的步骤。

如果只有一个盘子,则不需要利用B座,直接将盘子从A移动到C。

•如果有2个盘子,可以先将盘子1上的盘子2移动到B;将盘子1移动到c;将盘子2移动到c。

这说明了:可以借助B将2个盘子从A移动到C,当然,也可以借助C将2个盘子从A移动到B。

•如果有3个盘子,那么根据2个盘子的结论,可以借助c将盘子1上的两个盘子从A移动到B;将盘子1从A移动到C,A变成空座;借助A座,将B上的两个盘子移动到C。

这说明:可以借助一个空座,将3个盘子从一个座移动到另一个。

•如果有4个盘子,那么首先借助空座C,将盘子1上的三个盘子从A移动到B;将盘子1移动到C,A变成空座;借助空座A,将B座上的三个盘子移动到C。

代码如下:。

汉诺塔递归算法及详解

汉诺塔递归算法及详解

汉诺塔递归算法及详解汉诺塔(Hanoi Tower)是一种数学谜题,由法国数学家Édouard Lucas在19世纪中期提出。

这个谜题由三根柱子和一组圆盘组成,圆盘从上到下按照从小到大的顺序放置在柱子上。

问题的目标是将所有圆盘从一个柱子移动到另一个柱子,每次只能移动一个圆盘,并且不能将大的圆盘放在小的圆盘上面。

解决汉诺塔问题的一种常见方法是使用递归算法。

递归是一种数学和计算机科学中常见的方法,通过将复杂的问题分解为更小的相同问题的子问题来解决。

汉诺塔的递归算法主要包含以下步骤:1.将N-1个圆盘从起始柱子移动到中间柱子上,这可以通过将起始柱子作为源柱子,中间柱子作为辅助柱子,目标柱子为空柱子来实现。

这个步骤可以通过递归调用来实现,将起始柱子作为源柱子,中间柱子作为辅助柱子,目标柱子作为空柱子。

2.将第N个圆盘从起始柱子移动到目标柱子上。

3.将N-1个圆盘从中间柱子移动到目标柱子上,这可以通过将中间柱子作为源柱子,目标柱子作为辅助柱子,起始柱子作为空柱子来实现。

这个步骤可以通过递归调用来实现,将中间柱子作为源柱子,目标柱子作为辅助柱子,起始柱子作为空柱子。

下面是一个示例代码,使用递归算法解决汉诺塔问题:```pythondef hanoi(n, source, target, auxiliary):if n > 0:#将N-1个圆盘从起始柱子移动到中间柱子hanoi(n-1, source, auxiliary, target)#将第N个圆盘从起始柱子移动到目标柱子print("Move disk", n, "from", source, "to", target)#将N-1个圆盘从中间柱子移动到目标柱子hanoi(n-1, auxiliary, target, source)#测试n=3hanoi(n, 'A', 'C', 'B')```上述代码中,`hanoi(`函数接受四个参数:圆盘的数量n,起始柱子source,目标柱子target和辅助柱子auxiliary。

汉诺(Hanoi)塔问题(C#版)

汉诺(Hanoi)塔问题(C#版)

汉诺(Hanoi)塔问题(C#版)
⼀个只能⽤递归解决的数学问题;问题描述:古代有⼀个梵塔,塔内有3个座,A、B、C,开始时A座有64个盘,盘⼦⼤⼩不等,⼤的在上,⼩的在下。

有⼀个⽼和尚想把这64个盘⼦从A座移到C座(如图所⽰),但每次只允许移动⼀个盘,且在移动过程中在3个座上始终保持⼤盘在下,⼩盘在上。

在移动地程中可以⾏⽤B座,要求编程序打印出移动的步骤。

逆向推理:1.假如⼀个和尚能把上⾯63个盘⼦先搬到B座,第⼆个和尚再把最⼤的那个移到C,第三个和尚再把63个盘⼦移到C座;⾄此整个⼯作就完成的。

2.问题是怎么才能把63个盘⼦移到B座,按照同样的⽅法,先把62个盘⼦选移到C座
,再把第63个盘⼦移到B座,最后再将62个盘⼦移到B座。

3……如此类推;
4.从上⾯分析可以看出:只有等后⾯那个和尚搬完盘⼦,前⾯的和尚才能够去完成任。

让我们来栈的数据结构:数据的处理只在⼀端处理,且是先进后出。

所以⽤递归的⽅法去处理是正确的。

(汉诺塔图)
汉诺塔问题解决⽅案
如果你发现有什么错误之处,请指出!谢谢了。

汉诺塔问题

汉诺塔问题

汉诺塔百科名片汉诺塔初始状态汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。

上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。

上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

目录由来汉诺塔与宇宙寿命concreteHAM:汉诺塔问题的程序实现由来汉诺塔与宇宙寿命concreteHAM:汉诺塔问题的程序实现展开编辑本段由来来源汉诺塔是源自印度神话里的玩具。

上帝创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按大小顺序摞着64片黄金圆盘。

上帝命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。

并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

传说在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。

印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。

不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。

僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。

不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。

这需要多少次移动呢?这里需要递归的方法。

假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。

此后不难证明f(n)=2^n-1。

n=64时,f(64)= 2^64-1=18446744073709551615假如每秒钟一次,共需多长时间呢?一个平年365天有31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下,18446744073709551615/31556952=584554049253.855年这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。

汉诺塔问题——精选推荐

汉诺塔问题——精选推荐

汉诺塔问题汉诺塔问题是⼀个经典的问题。

汉诺塔(Hanoi Tower),⼜称河内塔,源于印度⼀个古⽼传说。

⼤梵天创造世界的时候做了三根⾦刚⽯柱⼦,在⼀根柱⼦上从下往上按照⼤⼩顺序摞着64⽚黄⾦圆盘。

⼤梵天命令婆罗门把圆盘从下⾯开始按⼤⼩顺序重新摆放在另⼀根柱⼦上。

并且规定,任何时候,在⼩圆盘上都不能放⼤圆盘,且在三根柱⼦之间⼀次只能移动⼀个圆盘。

问应该如何操作?分析如果是初次接触类似的问题,乍看之下肯定会感觉⽆从下⼿。

要把64个圆盘从a柱⼦移动到c柱⼦上,第⼀步应该怎么做?虽然可以肯定,第⼀步唯⼀的选择是移动a最上⾯的那个圆盘,但是应该将其移到b还是c呢?很难确定。

因为接下来的第⼆步、第三步……直到最后⼀步,看起来都是很难确定的。

能⽴即确定的是最后⼀步:最后⼀步的盘⼦肯定也是a最上⾯那个圆盘,并且是由a或b移动到c——此前已经将63个圆盘移动到了c上。

也许你会说,管他呢,先随便试着移动⼀下好了。

如果你这么做,你会发现,接下来你会⾯临越来越多类似的选择,对每⼀个选择都“试”⼀下的话,你会偏离正确的道路越来越远,直到你发现你接下来⽆法进⾏为⽌。

如果将这个问题的盘⼦数量减为10个或更少,就不会有太⼤的问题了。

但盘⼦数量为64的话,你⼀共需要移动约1800亿亿步(18,446,744,073,709,551,615),才能最终完成整个过程。

这是⼀个天⽂数字,没有⼈能够在有⽣之年通过⼿动的⽅式来完成它。

即使借助于计算机,假设计算机每秒能够移动100万步,那么约需要18万亿秒,即58万年。

将计算机的速度再提⾼1000倍,即每秒10亿步,也需要584年才能够完成。

注:在我的笔记本电脑上,每秒⼤约能够移动6~8百万步。

虽然64个盘⼦超出了⼈⼒和现代计算机的能⼒,但⾄少对于计算机来说,这不是⼀个⽆法完成的任务,因为与我们⼈类不同,计算机的能⼒在不断提⾼。

分解问题⼀股脑地考虑每⼀步如何移动很困难,我们可以换个思路。

python汉诺塔问题

python汉诺塔问题

python汉诺塔问题⼀、汉诺塔问题汉诺塔(⼜称河内塔)问题是源于印度⼀个古⽼传说的益智玩具。

⼤梵天创造世界的时候做了三根柱⼦,在⼀根柱⼦上从下往上按照⼤⼩顺序摞着64⽚黄⾦圆盘。

⼤梵天命令婆罗门把圆盘从下⾯开始按⼤⼩顺序重新摆放在另⼀根柱⼦上。

并且规定,在⼩圆盘上不能放⼤圆盘,在三根柱⼦之间⼀次只能移动⼀个圆盘⼆、汉诺塔问题分析我们可以将问题简化描述为:n个盘⼦和3根柱⼦:A(源)、B(备⽤)、C(⽬的),盘⼦的⼤⼩不同且中间有⼀孔,可以将盘⼦“串”在柱⼦上,每个盘⼦只能放在⽐它⼤的盘⼦上⾯。

起初,所有盘⼦在A柱上,问题是将盘⼦⼀个⼀个地从A柱⼦移动到C柱⼦。

移动过程中,可以使⽤B 柱,但盘⼦也只能放在⽐它⼤的盘⼦上⾯。

因此我们得出汉诺塔问题的以下⼏个限制条件:1.在⼩圆盘上不能放⼤圆盘。

2.在三根柱⼦之间⼀回只能移动⼀个圆盘。

3.只能移动在最顶端的圆盘。

⾸先,我们从简单的例⼦开始分析,然后再总结出⼀般规律。

当n = 1的时候,即此时只有⼀个盘⼦,那么直接将其移动⾄C即可。

移动过程就是 A -> C当n = 2的时候,这时候有两个盘⼦,那么在⼀开始移动的时候,我们需要借助B柱作为过渡的柱⼦,即将A柱最上⾯的那个⼩圆盘移⾄B柱,然后将A柱底下的圆盘移⾄C柱,最后将B柱的圆盘移⾄C柱即可。

那么完整移动过程就是A-> B , A -> C , B -> C当n = 3的时候,那么此时从上到下依次摆放着从⼩到⼤的三个圆盘,根据题⽬的限制条件:在⼩圆盘上不能放⼤圆盘,⽽且把圆盘从A柱移⾄C柱后,C柱圆盘的摆放情况和刚开始A柱的是⼀模⼀样的。

所以呢,我们每次移⾄C柱的圆盘(移⾄C柱后不再移到其他柱⼦上去),必须是从⼤到⼩的,即⼀开始的时候,我们应该想办法把最⼤的圆盘移⾄C柱,然后再想办法将第⼆⼤的圆盘移⾄C柱......然后重复这样的过程,直到所有的圆盘都按照原来A柱摆放的样⼦移动到了C柱。

汉诺塔递归算法

汉诺塔递归算法

汉诺塔递归算法
1. 简介
汉诺塔(Hanoi Tower)是一种经典的数学问题,它由法国数学家Edouard Lucas于1883年引入,并以法国一个寺庙的名字命名。

汉诺塔问题是一个经典的递归问题,它可以通过递归算法来解决。

2. 问题描述
汉诺塔问题的问法如下:
有三根柱子A、B、C,初始时柱子A上有若干个大小不同的盘子,按照从小到大的顺序从上往下叠放。

现在需要将这些盘子从柱子A移动到柱子C,移动过程中需要满足以下条件:
1.每次只能移动一个盘子;
2.每根柱子上的盘子都必须保持原有的从小到大的顺序。

问:如何才能将这些盘子从柱子A移动到柱子C,并且满足以上条件?
3. 解决方法
汉诺塔问题的解决方法之一是使用递归算法。

递归算法是一种通过函数自身调用来解决问题的方法。

对于汉诺塔问题,可以通过以下的递归算法来解决:
步骤
1.如果只有一个盘子需要移动,直接将盘子从柱子A移动到柱子C即可;
2.如果有多个盘子需要移动,将其分成三个步骤:
1.将n-1个盘子从柱子A移动到柱子B;
2.将最大的盘子从柱子A移动到柱子C;
3.将n-1个盘子从柱子B移动到柱子C。

递归实现
以下是使用递归实现汉诺塔问题的Python代码:
```python def hanoi(n, A, B, C): if n == 1: print(f。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

⾯试常考算法题
(七)-汉诺塔问题
⼀. 编程题
1.
对于传统的汉诺塔游戏我们做⼀个拓展,我们有从⼤到⼩放置的n 个圆盘,开始时所有圆盘都放在左边的柱⼦上,按照汉诺塔游戏的要求我们要把所有的圆盘都移到右边的柱⼦上,请实现⼀个函数打印最优移动轨迹。

给定⼀个int n ,表⽰有n 个圆盘。

请返回⼀个string 数组,其中的元素依次为每次移动的描述。

描述格式为:move from [left/mid/right] to [left/mid/right]。

测试样例:
1
返回:move from left to right
2.
有⼀个int 数组arr 其中只含有1、2和3,分别代表所有圆盘⺫前的状态,1代表左柱,2代表中柱,3代表右柱,arr[i]的值代表第i+1个圆盘的位置。

⽐如,arr=[3,3,2,1],代表第1个圆盘在右柱上、第2个圆盘在右柱上、第3个圆盘在中柱上、第4个圆盘在左柱上。

如果arr 代表的状态是最优移动轨迹过程中出现的状态,返回arr 这种状态是最优移动轨迹中的第⼏个状态。

如果arr 代表的状态不是最优移动轨迹过程中出现的状态,则返回-1。

给定⼀个int 数组arr 及数组的⼤⼩n ,含义如题所述,请返回⼀个int ,代表所求的结果。

测试样例:
[3,3]
返回:3
登录⽜客⺴,参与以上题⺫讨论,查看更多笔试⾯试题
技术QQ 群:379386529 微博:/nowcoder 微信
⽜客⽹-中国最⼤IT 笔试/⾯试题库⽜客出品-。

相关文档
最新文档