python汉诺塔递归详解(一)
数据结构汉诺塔递归算法
数据结构汉诺塔递归算法1. 什么是汉诺塔问题汉诺塔(Hanoi)是由法国数学家爱德华·卢卡斯(Édouard Lucas)在19世纪初提出的一个经典数学问题。
问题的描述如下:假设有3个柱子(标记为A、B、C),其中柱子A上有n个不同大小的圆盘,按照从上到下的顺序由小到大放置。
现在要将这n个圆盘按照相同的顺序移动到柱子C 上,期间可以借助柱子B。
在移动时,要遵循以下规则:1.每次只能移动一个圆盘;2.每个圆盘只能放置在比它大的圆盘上面;3.只能借助柱子B进行中转。
汉诺塔问题的目标是找到一种最优策略,使得完成移动所需的步骤最少。
2. 汉诺塔问题的递归解法汉诺塔问题的递归解法非常简洁和优雅。
下面就来详细介绍递归解法的思路和步骤。
2.1. 基本思路我们先来思考一个简化版的问题:将柱子A上的n个圆盘移动到柱子B上。
为了实现这个目标,可以进行如下步骤:1.将A柱上的n-1个圆盘通过借助柱子B移动到柱子C上;2.将A柱上的第n个圆盘直接移动到柱子B上;3.将柱子C上的n-1个圆盘通过借助柱子A移动到柱子B上。
根据上述思路,我们可以发现一个递归的规律:将n个圆盘从A柱移动到B柱,可以分解为两个子问题,即将n-1个圆盘从A柱移动到C柱,和将n-1个圆盘从C柱移动到B柱。
2.2. 递归实现根据以上思路,我们可以编写一个递归函数来实现汉诺塔问题的解决。
def hanoi(n, A, B, C):if n == 1:print(f"Move disk {n} from {A} to {B}")else:hanoi(n-1, A, C, B)print(f"Move disk {n} from {A} to {B}")hanoi(n-1, C, B, A)这个递归函数接受4个参数:n 表示圆盘的数量,A、B、C 表示3根柱子的名称。
当 n 为 1 时,直接将圆盘从 A 移动到 B。
汉诺塔问题数学解法
汉诺塔问题数学解法汉诺塔问题是一个经典的数学难题,也是计算机科学中的常见算法题目。
在这个问题中,我们需要将三个塔座上的圆盘按照一定规则从一座塔移动到另一座塔,只能每次移动一个圆盘,并且在移动过程中始终保持大圆盘在小圆盘下面。
为了解决汉诺塔问题,我们首先需要了解递归的概念。
递归是一种问题解决方法,其中问题被分解为更小的子问题,直到最小的问题可以直接解决。
在汉诺塔问题中,我们可以使用递归来实现移动圆盘的步骤。
设有三个塔座,分别为A、B、C,并且初始时所有的圆盘都在A 塔上,我们的目标是将所有的圆盘移动到C塔上。
为了方便讨论,我们将最小的圆盘称为第1号圆盘,次小的圆盘称为第2号圆盘,以此类推,最大的圆盘称为第n号圆盘。
解决汉诺塔问题的数学解法如下:1. 当只有一个圆盘时,直接将它从A塔移动到C塔,移动结束。
2. 当有两个或以上的圆盘时,可以按照以下步骤进行移动:(1) 先将上面n-1个圆盘从A塔移动到B塔(借助C塔)。
(2) 将第n号圆盘从A塔移动到C塔。
(3) 最后将n-1个圆盘从B塔移动到C塔(借助A塔)。
通过以上步骤,我们可以将n个圆盘从A塔移动到C塔,完成整个汉诺塔问题的解。
这个数学解法的正确性可以通过递归的思想来解释。
当有n个圆盘时,我们需要借助第三个塔座将前n-1个圆盘移动到B塔上,然后将第n号圆盘移动到C塔上,最后再将n-1个圆盘从B塔移动到C塔上。
这个过程可以看作是一个递归过程,我们首先需要将前n-1个圆盘从A 塔移动到B塔上,然后再将第n号圆盘从A塔移动到C塔上,最后再将n-1个圆盘从B塔移动到C塔上。
通过不断缩小问题规模,我们最终可以将整个汉诺塔问题解决。
总结起来,汉诺塔问题是一个经典的数学难题,解决这个问题可以使用递归的数学解法。
通过将问题分解为更小的子问题,我们可以将n 个圆盘从一座塔移动到另一座塔上。
这个数学解法的正确性可以通过递归的思想来解释。
希望通过以上的介绍,您对汉诺塔问题的数学解法有了更深入的理解。
汉诺塔(代码记录+注释)
最后将借用塔上的n1个盘子移动到目的塔上intmainprintf请输入盘子的个数
汉诺塔(代码记录 +注释)
//汉诺塔问题 //输出移动的步骤 #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("%d",&n); char x='A',y='B',z='C'; printf("盘子移动情况如下:\n"); hanoi(n,x,y,z); return 0 ;
汉若塔实验报告
一、实验背景汉诺塔问题(Hanoi Tower Problem)是一个经典的递归问题,最早由法国数学家亨利·埃德蒙·卢卡斯(Edouard Lucas)在1883年提出。
该问题涉及三个柱子和一系列大小不同的盘子,初始时所有盘子按照从小到大的顺序叠放在一个柱子上。
问题的目标是按照以下规则将所有盘子移动到另一个柱子上:每次只能移动一个盘子,且在移动过程中,大盘子不能放在小盘子上面。
汉诺塔问题不仅是一个数学问题,也是一个计算机科学问题。
它在算法设计、递归算法分析等领域有着重要的应用价值。
通过解决汉诺塔问题,可以加深对递归算法的理解,同时也能够锻炼逻辑思维和问题解决能力。
二、实验目的1. 理解汉诺塔问题的基本原理和解决方法。
2. 掌握递归算法的设计和应用。
3. 分析汉诺塔问题的复杂度,为实际应用提供参考。
三、实验内容1. 实验环境:Windows操作系统,Python编程语言。
2. 实验步骤:(1)设计一个汉诺塔问题的递归算法。
(2)编写程序实现该算法。
(3)测试算法在不同盘子数量下的运行情况。
(4)分析算法的复杂度。
3. 实验程序:```pythondef hanoi(n, source, target, auxiliary):if n == 1:print(f"Move disk 1 from {source} to {target}")returnhanoi(n-1, source, auxiliary, target)print(f"Move disk {n} from {source} to {target}") hanoi(n-1, auxiliary, target, source)# 测试程序hanoi(3, 'A', 'C', 'B')```4. 实验结果:(1)当盘子数量为3时,程序输出以下移动序列:```Move disk 1 from A to CMove disk 2 from A to BMove disk 1 from C to BMove disk 3 from A to CMove disk 1 from B to AMove disk 2 from B to CMove disk 1 from A to C```(2)当盘子数量为4时,程序输出以下移动序列:```Move disk 1 from A to CMove disk 2 from A to BMove disk 1 from C to BMove disk 3 from A to CMove disk 1 from B to AMove disk 2 from B to CMove disk 1 from A to CMove disk 4 from A to BMove disk 1 from C to BMove disk 2 from C to AMove disk 1 from B to AMove disk 3 from C to BMove disk 1 from A to CMove disk 2 from A to BMove disk 1 from C to BMove disk 4 from B to CMove disk 1 from B to AMove disk 2 from A to CMove disk 1 from A to C```四、实验分析1. 算法复杂度:汉诺塔问题的递归算法具有指数级的复杂度,其时间复杂度为O(2^n),其中n为盘子的数量。
python汉诺塔非递归算法
python汉诺塔非递归算法如何使用Python编写非递归的汉诺塔算法首先,让我们回顾一下汉诺塔问题的背景。
汉诺塔是一个经典的数学问题,涉及到递归和栈的使用。
问题的目标是将一组不同大小的圆盘从一个柱子移动到另一个柱子,其中有三个柱子可供选择。
在移动过程中,您必须遵守以下规则:1. 您只能移动一个圆盘,并且只能将较小的圆盘放在较大的圆盘上。
2. 您只能在三个柱子之间移动圆盘。
3. 将所有圆盘从一个柱子移动到另一个柱子上是成功的。
使用递归算法可以很容易地解决这个问题。
然而,递归算法在处理大量圆盘时可能会导致递归深度过大,从而消耗大量的内存和计算时间。
因此,我们需要采用非递归的方法来解决这个问题。
接下来,让我们一步一步地介绍如何使用Python编写非递归的汉诺塔算法:步骤1: 定义一个Stack类首先,我们需要定义一个Stack类来模拟栈的行为。
在Python中,可以使用列表来实现这个类。
我们可以使用列表的append()方法将元素添加到栈顶,使用pop()方法从栈顶取出元素,使用isEmpty()方法检查栈是否为空,以及使用size()方法获取栈的大小。
下面是Stack类的代码实现:class Stack:def __init__(self):self.items = []def isEmpty(self):return len(self.items) == 0def push(self, item):self.items.append(item)def pop(self):return self.items.pop()def size(self):return len(self.items)步骤2: 定义一个非递归的汉诺塔函数接下来,我们需要定义一个非递归的汉诺塔函数。
该函数的输入参数包括圆盘的数量、起始柱子、目标柱子和辅助柱子。
函数的实现思路如下:- 首先,将所有的圆盘按照倒序从起始柱子压入起始栈。
汉诺塔问题数学解法
汉诺塔问题数学解法
一、建立递归模型
汉诺塔问题是一个经典的递归问题,可以通过建立递归模型来求解。
递归模型的基本思想是将问题分解为更小的子问题,然后通过对子问题的求解来得到原问题的解。
二、定义变量
在汉诺塔问题中,我们可以定义以下变量:
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. 如果有多个圆盘需要移动,则按以下步骤进行操作:
- 将除最下方的圆盘以外的上方圆盘从起始塔杆移动到辅助塔杆上。
这可以通过递归调用解决较小规模的子问题来实现,即将上方圆盘从起始塔杆移动到目标塔杆上(目标塔杆作为新的辅助塔杆)。
- 然后将最下方的圆盘从起始塔杆直接移动到目标塔杆上。
- 最后,将辅助塔杆上的所有圆盘移动到目标塔杆上,这可以通过递归调用解决较小规模的子问题来实现,即将上方圆盘从辅助塔杆移动到起始塔杆上(起始塔杆作为新的目标塔杆)。
通过递归地应用以上步骤,就可以实现将所有圆盘从起始塔杆移动到目标塔杆上的操作。
汉诺塔游戏:递归经典问题
汉诺塔游戏:递归经典问题汉诺塔游戏,是非常著名的智力趣味题,在很多算法书籍和智力竞赛中都有涉及。
汉诺塔游戏的基本规则是:在一块板子上,有三根编号分别为A、B、C的杆,在A杆上按自下而上、由大到小的顺序放置着64个(或其他数目)圆盘,每次只能移动一个圆盘,并且在移动过程中三根杆上都始终保持大盘在下、小盘在上的状态,操作过程中圆盘可以在A、B、C任意一杆上,要如何把A杆上的圆盘全部移到C杆上?以3个圆盘为例:将3个圆盘按由小到大的顺序分别记作P1、P2、P3。
按照规则将三个圆盘从A杆移至C杆,则需以下步骤:(1)先将P1移至C杆,再将P2移至B杆,然后将P1移至B杆,此时P1和P2均在B杆上(需3步);(2)将P3移至C杆(需1步);(3)将P1移至A杆,将P2移至C杆,最后将P1移至C杆(需3步)。
在此过程中,要将P3移至C杆,先将C杆当作中介,将P1移至C杆;再将P1、P2先移至B杆,借用B杆做中介;再将P2移至C杆时,又先将P1移至A杆,借用了A杆做中介。
(总共7步完成)以此为例,如何完成其他数量圆盘的移动操作呢?当n=1时,只需将编号为1的圆盘从A柱直接移至C柱上即可。
当n=2时,利用B柱作为辅助柱,先将圆盘1移至B柱,再将圆盘2由A柱直接移至C柱,然后再将圆盘1由B柱移至C柱。
当n=3时,同样利用B柱作为辅助柱,依照上述原则,先设法将圆盘1、2移至B柱,待圆盘3由A柱移至C柱后,再依照上述原则设法将圆盘1、2移至C柱。
......依此类推,当n>1时,需利用B柱作为辅助柱,先设法将压在编号为n的圆盘上的n-1个圆盘从A柱(依照上述原则)移至C柱,待编号为n的圆盘从A柱移至C柱后,再将B柱上的n-1个圆盘(依照上述原则)移至C柱。
游戏的移动操作很简单,但是如何将64个圆盘从一根杆子上移到另一根杆子上,并且始终保持上小下大的顺序,一共需要移动多少次才是让人头疼的问题。
游戏过程中不难发现:不管把哪一个圆盘移到另一根杆子上,移动的次数都要比移动上面一个增加一倍。
汉诺塔递归算法范文
汉诺塔递归算法范文汉诺塔是一种经典的数学问题,它涉及到递归算法的应用。
汉诺塔问题的描述是:有三个柱子A、B、C,其中A柱上有n个从小到大放置的圆盘,现在要将这n个圆盘按照从小到大的顺序移动到C柱上,并且每次只能移动一个圆盘,且在移动过程中,必须保证大圆盘在小圆盘上面。
那么如何用递归算法解决汉诺塔问题呢?为了更好地理解汉诺塔问题,我们可以将问题简化为只有三个圆盘的情况。
设三个柱子分别为A、B、C,初始时将三个圆盘都放在A柱上,目标是将这三个圆盘从A柱移动到C柱上。
我们可以给每个圆盘编号,编号越小表示圆盘越小。
问题解决的步骤如下:1.将编号为1的圆盘从A柱移动到C柱上;2.将编号为2的圆盘从A柱移动到B柱上;3.将编号为1的圆盘从C柱移动到B柱上;4.将编号为3的圆盘从A柱移动到C柱上;5.将编号为1的圆盘从B柱移动到A柱上;6.将编号为2的圆盘从B柱移动到C柱上;7.将编号为1的圆盘从A柱移动到C柱上。
以上步骤可以总结为以下规律:1)当只有一个圆盘时,直接将它从起始柱移动到目标柱;2)当有两个以上的圆盘时,可以将它们看作两个部分:最底下的圆盘和上面的所有圆盘。
首先将上面的所有圆盘从起始柱移动到中间柱(借助目标柱),然后将最底下的圆盘从起始柱移动到目标柱,最后将上面的所有圆盘从中间柱(借助起始柱)移动到目标柱。
基于以上规律,我们可以得到如下的递归算法实现汉诺塔问题。
```pythondef hanoi(n, start, end, middle):if n == 1:print('Move disk', n, 'from', start, 'to', end)else:hanoi(n-1, start, middle, end)print('Move disk', n, 'from', start, 'to', end)hanoi(n-1, middle, end, start)#测试hanoi(3, 'A', 'C', 'B')```在上述代码中,hanoi函数代表了汉诺塔问题的递归解决方案。
汉诺塔python代码
汉诺塔python代码汉诺塔游戏是一种经典的益智游戏,它的规则非常简单,但是解决这个问题却需要一定的思维能力,而且它还可以通过编程来实现。
Python是一门非常流行的编程语言,因此在这里我们将介绍如何使用Python来实现汉诺塔游戏。
一、汉诺塔游戏的规则汉诺塔游戏有三个柱子和若干个盘子,每个盘子大小不同。
开始时,所有盘子都放在一个柱子上,按照从大到小的顺序排列。
目标是将所有盘子从起始柱子移动到目标柱子上,并保持原来的顺序不变。
在移动过程中必须遵守以下规则:1. 每次只能移动一个盘子;2. 盘子只能放在比它大的盘子上面;3. 不能将一个大盘子放在一个小盘子上面。
二、使用递归算法实现汉诺塔游戏递归算法是解决汉诺塔问题最常用的方法之一。
下面我们将介绍如何使用递归算法来实现汉诺塔游戏。
1. 定义函数首先我们需要定义一个函数来实现汉诺塔游戏。
在这个函数中,我们需要传入三个参数:起始柱子、目标柱子和盘子的数量。
def hanoi(start, target, n):2. 判断递归结束条件在递归过程中,我们需要判断递归结束的条件。
当n等于1时,表示只有一个盘子需要移动,此时我们可以直接将它从起始柱子移动到目标柱子上。
if n == 1:print(start, "->", target)3. 递归调用如果n大于1,则需要进行递归调用。
首先我们需要将n-1个盘子从起始柱子移动到辅助柱子上,然后再将最后一个盘子从起始柱子移动到目标柱子上,最后将n-1个盘子从辅助柱子移动到目标柱子上。
else:hanoi(start, other, n-1)print(start, "->", target)hanoi(other, target, n-1)4. 完整代码下面是完整的使用递归算法实现汉诺塔游戏的Python代码:def hanoi(start, target, n):if n == 1:print(start, "->", target)else:other = 6 - start - targethanoi(start, other, n-1)print(start, "->", target)hanoi(other, target, n-1)hanoi(1, 3, 3)三、使用非递归算法实现汉诺塔游戏除了递归算法,我们还可以使用非递归算法来实现汉诺塔游戏。
汉诺塔递推公式
汉诺塔递推公式
汉诺塔问题是经典的递归问题,但是递归算法复杂度较高,需要进行优化。
通过分析汉诺塔问题可以发现,移动盘子数为n时,需要移动的次数为2^n-1,同时移动过程中,每个盘子只会被移动一次。
因此,我们可以通过递推公式来计算汉诺塔问题的解法。
设H(n)表示移动n个盘子所需移动的次数,H(1)=1,H(n)=2*H(n-1)+1。
递推公式的意义是:将n个盘子从A柱借助B柱移动到C柱的最小步数等于将n-1个盘子从A柱借助C柱移动到B柱的最小步数乘以2加1。
使用递推公式可以大大减少汉诺塔问题的时间复杂度,从而提高算法的效率。
- 1 -。
python实现汉诺塔问题
python实现汉诺塔问题⼀、分析汉诺塔实现过程有A,B,C三个圆柱,分别为初始位,过渡位,⽬标位。
设A柱为初始位,C位为最终⽬标位。
(1)将最上⾯的n-1个圆盘从初始位移动到过渡位;(2)将初始位的最底下的⼀个圆盘移动到⽬标位;(3)将过渡位的n-1个圆盘移动到⽬标位。
对于递归算法中的嵌套函数f(n-1)来说,其初始位,过渡位,⽬标位发⽣了变化。
(⼀)由此可得,汉诺塔线上实现的解决⽅法,代码如下:1def move(n,a,b,c): #n为圆盘数,a代表初始位圆柱,b代表过渡位圆柱,c代表⽬标位圆柱2if n==1:3print(a,'-->',c)4else:5 move(n-1,a,c,b) #将初始位的n-1个圆盘移动到过渡位,此时初始位为a,上⼀级函数的过渡位b即为本级的⽬标位,上级的⽬标位c为本级的过渡位6print(a,'-->',c)7 move(n-1,b,a,c) #将过渡位的n-1个圆盘移动到⽬标位,此时初始位为b,上⼀级函数的⽬标位c即为本级的⽬标位,上级的初始位a为本级的过渡位8 n = eval(input())9 move = (n,'A','B','C')(⼆)程序执⾏效果如下:⼆、⽤动画实现汉诺塔问题(以下代码最多运⾏7层汉诺塔问题)(⼀)具体代码如下:1import turtle23class Stack:4def__init__(self):5 self.items = []6def isEmpty(self):7return len(self.items) == 08def push(self, item):9 self.items.append(item)10def pop(self):11return self.items.pop()12def peek(self):13if not self.isEmpty():14return self.items[len(self.items) - 1]15def size(self):16return len(self.items)1718def drawpole_3(): #画出汉诺塔的poles19 t = turtle.Turtle()20 t.hideturtle()21def drawpole_1(k):22 t.up()23 t.pensize(10)24 t.speed(100)25 t.goto(400*(k-1), 100)26 t.down()27 t.goto(400*(k-1), -100)28 t.goto(400*(k-1)-20, -100)29 t.goto(400*(k-1)+20, -100)30 drawpole_1(0) #画出汉诺塔的poles[0]31 drawpole_1(1) #画出汉诺塔的poles[1]32 drawpole_1(2) #画出汉诺塔的poles[2]3334def creat_plates(n): #制造n个盘⼦35 plates=[turtle.Turtle() for i in range(n)]36for i in range(n):37 plates[i].up()38 plates[i].hideturtle()39 plates[i].shape("square")40 plates[i].shapesize(1,8-i)41 plates[i].goto(-400,-90+20*i)42 plates[i].showturtle()43return plates4445def pole_stack(): #制造poles的栈46 poles=[Stack() for i in range(3)]47return poles4849def moveDisk(plates,poles,fp,tp):#把poles[fp]顶端的盘⼦plates[mov]从poles[fp]移到poles[tp]50 mov=poles[fp].peek()51 plates[mov].goto((fp-1)*400,150)52 plates[mov].goto((tp-1)*400,150)53 l=poles[tp].size() #确定移动到底部的⾼度(恰好放在原来最上⾯的盘⼦上⾯)54 plates[mov].goto((tp-1)*400,-90+20*l)5556def moveTower(plates,poles,height,fromPole, toPole, withPole):#递归放盘⼦57if height >= 1:58 moveTower(plates,poles,height-1,fromPole,withPole,toPole)59 moveDisk(plates,poles,fromPole,toPole)60 poles[toPole].push(poles[fromPole].pop())61 moveTower(plates,poles,height-1,withPole,toPole,fromPole)6263 myscreen=turtle.Screen()64 drawpole_3()65 n=int(input("请输⼊汉诺塔的层数并回车:\n"))66 plates=creat_plates(n)67 poles=pole_stack()68for i in range(n):69 poles[0].push(i)70 moveTower(plates,poles,n,0,2,1)71 myscreen.exitonclick()(⼆)程序实现效果如下:实现动画过程的截图:。
Python递归算法实现汉诺塔(附代码+运行情况)
Python 递归算法实现汉诺塔(附代码+运⾏情况)⾸先你要知道汉诺塔是通过递归函数来解决的,递归函数,通俗易懂讲就是⾃⼰调⽤⾃⼰,类似于猫抓⾃⼰的尾巴,然后你可以脑⼦⾥把他想象成⼀个圈了。
汉诺塔的规则我就不说了,只给⼤家讲讲怎么理解代码为了讲解清楚,我给代码标记了⾏号。
①如果圆盘只有1,那就随便移动,直接把A 移动到C, A->C②就是圆盘数量不是1的时候,代码中第四⾏开始。
在讲之前,我们看第三⾏代码我们可以看到,在代码实现中A 直接移动到C ,是(a ‘>’ c )我们在看第⑤⾏代码,意思是A 移动B ,那么代码就是(A B )A 指向B就是A 在左,B 在最后,缓冲柱就在中间,⼤家可以观察观察是不是这样,到底是怎么做缓冲的,⼤家可以把这三个柱⼦想象成我前⾯说的⼀个圆圈举个例⼦哦,如果C 移动到B ,那么就是(C A B )C 在左 B 在右 中间是缓冲柱,现在⼀想就很清楚了。
代码+运⾏结果1 def move(n,a,b,c): #n 代表圆盘数,a,b,c 分别代表初始柱,缓冲柱,⽬标柱2 if n==1:3 print (a,'-->',c)4 else :5 move(n-1,a,c,b)#将 N-1 个圆盘从A 移动到B (A C B)6 print (a,'-->',c) 将最⼤的圆盘从A 直接移动到C (A C )因为不需要任何缓冲,直接移过去,所以是没有缓冲柱7 move(n-1,b,a,c) 将 N-1 个圆盘从B 移动到C (B A C )print (a,'-->',c)move(n-1,a,c,b)。
Python实现汉诺塔实验
结束条件hanoin1acb把n1个盘子当成一个整体将n1个盘子从a经过c移动到bprintfamovingtochanoin1bac然后把n从a移动到c将n1个盘子从b经过a移动到celse
Python实 现 汉 诺 塔 实 验
汉诺塔主要是有三个塔座A,B,C,要求将三个大小不同,依小到大编号为1,2.....n的圆盘从A移动到塔座C上,要求 (1):每次只能移动一个圆盘 (2):圆盘可以插到A,B,C中任一塔座上 (3):任何时候不能将一个较大的圆盘压在较小的圆盘之上
if __name__=="__main__": hanoi(10"C")
汉诺塔不递归算法 python
汉诺塔(Tower of Hanoi)是一个经典的问题,它源自印度传说,相传在一个印度庙里,有一个圆座,圆座上套着三根铜柱,柱上套着64片黄金圆盘。
圆盘从大到小依序套在一根柱子上,而圆盘要从柱子上移至另一柱子上。
并且呢,规矩是穿小的不能套在大的上面,且每次只能移动一片。
有个传说是这样说的:世界末日来临前,大梵天要将这些圆盘从最左边的柱子移动到最右边的柱子上,如果在世界毁灭之前完成的话,世界就不毁灭了。
所以印度教徒一直想要研究这个问题,因为他们认为只要研究出汉诺塔的奥义,就能够通过移动圆盘,把世界毁灭的最终日期推迟。
但是即便是现代日常生活中,汉诺塔的问题也被广泛的用于算法科学的教学与理论研究之中。
那么究竟这个汉诺塔问题是怎样呢?究竟它的算法应该怎样编写呢?Python语言应该怎样实现它呢?下面就让我为你一一解答:一、汉诺塔问题背后的算法逻辑1. 汉诺塔问题的规则汉诺塔问题是经典的递归问题,它遵循以下规则:1)每次只能移动一个盘子;2)大盘子不能放在小盘子上面;3)只能在三根柱子之间移动盘子。
2. 汉诺塔问题的解法对于汉诺塔问题的解法,我们可以简单概括为以下三个步骤:A. 将n-1个盘子由A柱经过C柱移动到B柱;B. 将第n个盘子由A柱移动到C柱;C. 将n-1个盘子由B柱经过A柱移动到C柱。
二、非递归算法的实现在Python中,我们可以使用非递归算法来实现汉诺塔问题的解法。
下面给出一个示例代码:```pythondef hanoi(n, a, b, c):i = 1while n > 0:if n == 1:print("将第", n, "个盘子由", a, "移动到", c)else:print("将第", n, "个盘子由", a, "移动到", b)print("将第", n, "个盘子由", b, "移动到", c)print("将第", n, "个盘子由", c, "移动到", a)n -= 1```以上的代码中,我们使用了一个while循环来模拟递归的过程,实现了汉诺塔问题的非递归解法。
汉诺塔游戏递归
qiu(n); {调用子程序}
writeln(s:2:0)
end.
展示实力
万炽洋的程序:
1、某人写了n封信和n个信封,结果所有信都装错信封。求所有的信都装错信封共有多少种不同的情况。
2、楼梯有n阶台阶,上楼可以一步上一阶,也可以一步上二阶。请用递归方法编程计算共有多少种不同的走法。
3、用递归方法方法完成:有52张牌,使它们全部正面朝上,第一轮是从第2张开始,凡是2的倍数位置上的牌翻成正面朝下;第二轮从第三张牌开始,凡是3的倍数位置上的牌以,正面朝上的翻成正面朝下,正面朝下的翻成正面朝上;第三轮从第4张牌开始,凡是4的倍数位置上的牌按上面相同规则翻转,从此类推,直到第一张要翻的牌超过52为止。统计最后有几张牌正面朝上,以及它们的位置号。
〖分析〗读入一个字符,判断是否为"#"号,如果不是就继续读入,即可以调用程序本身。如果是“#”,则输出字符
〖参考程序〗
program P17_4;
procedure rever;
var c:char;
begin
read(c);
if c<>'#' then rever; {递归调用的地方,下一次调用会分配新单元c}
汉诺塔数据结构详解
汉诺塔数据结构详解
汉诺塔是一种经典的递归问题,它涉及到的数据结构有以下几种: 1. 栈:汉诺塔问题中,我们需要用栈来存储每个盘子的编号。
当我们要将某个盘子移动时,我们需要从栈中取出该盘子,并将其放到目标栈中。
2. 数组:汉诺塔问题中,我们需要用数组来存储每个盘子的大小。
这样,我们才能按照从大到小的顺序将盘子移动。
3. 递归:汉诺塔问题是一个典型的递归问题。
我们可以用递归
来解决这个问题,即将大问题分解成小问题,直到问题规模足够小,可以直接解决。
4. 指针:汉诺塔问题中,我们需要用指针来记录每个盘子所在
的位置。
这样,我们才能正确地将盘子从一根柱子移动到另一根柱子上。
总之,汉诺塔问题是一个非常有趣的问题,它涉及到的数据结构和算法都非常重要。
掌握这些知识,可以帮助我们更好地理解数据结构和算法的本质。
- 1 -。
汉诺塔问题的递归解法和非递归解法(python语言实现)
汉诺塔问题的递归解法和⾮递归解法(python语⾔实现)1. 汉诺塔问题的⾮递归解法(python语⾔类解法)#!/usr/bin/env python#coding:utf-8import sysimport timereload(sys)sys.setdefaultencoding('utf-8')class Mycolumns(object):val=0#__slots__ = ['plates','name']def __init__(self,name='',plates_num=0): = nameself.plates = []if plates_num > 0 :for i in range(0,plates_num):self.plates.append(n-i)@staticmethoddef fun():Mycolumns.val +=1print"this is the %d th time to move" %(Mycolumns.val)【这段可以⽤类⽅法代替】【@classmethoddef fun(cls):cls.val +=1print"this is the %d th time to move" %(cls.val)】def initialize(n):stack = []mycolumn1 = Mycolumns('A',n)if n%2 == 0:mycolumn2 = Mycolumns('B')mycolumn3 = Mycolumns('C')index = 2else:mycolumn2 = Mycolumns('C')mycolumn3 = Mycolumns('B')index = 1stack.append(mycolumn1)stack.append(mycolumn2)stack.append(mycolumn3)return stack,indexdef nowcolumn(i,stack):for item in stack:if i in item.plates:return itemdef nextcolumn(i,stack):for item in stack:if i in item.plates:if i%2!=0:next = (stack.index(item)+1)%3else:next = (stack.index(item)+2)%3#print "%d next column is %s"%(i,stack[next].name)return stack[next]def move(nowcolumn,nextcolumn):n = nowcolumn.plates.pop()nextcolumn.plates.append(n)print "move plate %d from %s to %s" %(n,,)Mycolumns.fun()def hannuoyi(n):stack,index = initialize(n)#max = pow(2,n)-1#k =0#while(k<max): FINAL = [] for i in range(0,n): FINAL.append(n-i) while(stack[index].plates!=FINAL):for i in range(1,n+1):#print "i value is %d" %(i)if(nowcolumn(i,stack).plates.index(i)==len(nowcolumn(i,stack).plates)-1 and (nextcolumn(i,stack).plates==[] or i< nextcolumn(i,stack).plates[-1])): move(nowcolumn(i,stack),nextcolumn(i,stack))#k = k+1else:pass#print"can not move plate %d" %(i)print stack[0].plates,stack[0].nameprint stack[1].plates,stack[1].nameprint stack[2].plates,stack[2].nameif __name__=="__main__":n=3hannuoyi(n) 2. 汉诺塔问题的⾮递归解法(python语⾔过程式解法)#!/usr/bin/env python#coding:utf-8import sysimport timereload(sys)sys.setdefaultencoding('utf-8')global aa =0def fun():global aa = a+1print"this is the %d th time to move" %(a)def nowcolumn(i,stackA,stackB,stackC):if i in stackA:return stackAelif i in stackB:return stackBelse:return stackCdef nextcolumn(n,i,stackA,stackB,stackC):if n%2==0:if i in stackA:if i%2!=0:newcolumn = stackBelse:newcolumn = stackCif i in stackB:if i%2!=0:newcolumn = stackCelse:newcolumn = stackAif i in stackC:if i%2!=0:newcolumn = stackAelse:newcolumn = stackBelse:if i in stackA:if i%2==0:newcolumn = stackBelse:newcolumn = stackCif i in stackB:if i%2==0:newcolumn = stackCelse:newcolumn = stackAif i in stackC:if i%2==0:newcolumn = stackAelse:newcolumn = stackBreturn newcolumndef move(nowcolumn,nextcolumn):n = nowcolumn.pop()nextcolumn.append(n)print "move plate %d" %(n)fun()def hannuoyi(n):stackA = []stackB = []stackC = []FINAL = []for i in range(0,n):stackA.append(n-i)FINAL.append(n-i)print stackA,stackB,stackC,FINALwhile(stackC!=FINAL):for i in range(1,n+1):print "i value is %d" %(i)if(nowcolumn(i,stackA,stackB,stackC).index(i)==len(nowcolumn(i,stackA,stackB,stackC))-1 and (nextcolumn(n,i,stackA,stackB,stackC)==[] or i< nextcolumn(n,i,stackA,stackB,stackC)[-1])):move(nowcolumn(i,stackA,stackB,stackC),nextcolumn(n,i,stackA,stackB,stackC))else:print"can not move plate %d" %(i)print stackA,stackB,stackCif __name__=="__main__":n=6hannuoyi(n)2. 汉诺塔问题的递归解法(python语⾔)#!/usr/bin/env python#coding:utf-8import sysreload(sys)sys.setdefaultencoding('utf-8')global aa =0def fun():global aa = a+1def hannuoyi(n,A,B,C):if n==1:move(1,A,C)else:hannuoyi(n-1,A,C,B)move(n,A,C)hannuoyi(n-1,B,A,C)def move(n,tempA,tempB):print "move plate %d from column %s to column %s" %(n,tempA,tempB)fun()if __name__=="__main__":hannuoyi(3,'A','B','C')print "total:we need %d steps"%(a)。
python实现汉诺塔
结果如下:
python实现如下:
#汉诺塔 def move (n,a,b,c,d=1):
if n == 1: print(a,'-->',c) return d
d=d+move(n-1,a,c,b) #怎么吧n-1个碟子从,a移到bc, print(a,'-->',c)
d=d+move(n-1,b,a,c) #怎么将n-1个碟子从b移到ac去 return d #d是实现记录操作步数
大梵天创造世界的时候做了三根金刚石柱子在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘
python实 现 汉 诺 塔
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根柱子,在一根柱子上从下往上按 照大小顺序摞着64片黄金圆盘。
大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,圆盘
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
python汉诺塔递归详解(一)
Python汉诺塔递归解法
引言
汉诺塔(Hanoi Tower)是一种数学问题和益智游戏,由法国数学家爱德华·卢卡教授在19世纪初提出。
通过计算机编程解决汉诺塔问题,可以帮助我们更好地理解递归算法在编程中的应用。
问题描述
在汉诺塔问题中,有三个柱子和一些圆盘,每个柱子上的圆盘按
照从小到大的顺序叠放。
问题的目标是将所有圆盘从一根柱子移动到
另一根柱子上,每次只能移动一个圆盘,并且在移动过程中不允许大
圆盘放在小圆盘上面。
解法思路
我们可以使用递归的方法解决汉诺塔问题。
下面是解决汉诺塔问
题的基本步骤:
1.将上面n-1个圆盘从A柱移动到B柱。
2.将最大的圆盘从A柱移动到C柱。
3.将B柱上的n-1个圆盘移动到C柱。
通过递归调用这三个步骤,可以将所有的圆盘从A柱移动到C柱。
代码实现
以下是使用Python语言实现汉诺塔递归的代码:
def hanoi(n, A, B, C):
if n == 1:
print("Move disk 1 from", A, "to", C) return
hanoi(n-1, A, C, B)
print("Move disk", n, "from", A, "to", C) hanoi(n-1, B, A, C)
# 测试代码
hanoi(3, "A", "B", "C")
运行结果
运行上述代码,我们可以得到以下输出结果:
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
总结
通过递归算法,我们可以轻松解决汉诺塔问题。
这个问题不仅仅是一个数学难题,也是一个经典的编程题目,在理解递归算法的基础上,我们能够更好地解决其他类似的问题。
希望以上内容对你理解和学习Python汉诺塔递归解法有所帮助!讨论
递归思想
递归是一种解决问题的方法,它可以将一个大问题拆解成一个或多个相似的子问题来求解。
在汉诺塔问题中,我们使用递归来求解将n 个圆盘从一根柱子移动到另一根柱子的步骤。
通过递归,我们可以将大问题转化为小问题,并且通过不断的迭代来求解。
递归的基本思想是将大问题分解成更小的子问题,并使用相同的解决方法来解决子问题。
在实现递归算法时,我们需要定义好递归的终止条件,以免陷入无限的递归循环中。
代码解析
下面是对汉诺塔递归代码的解析:
def hanoi(n, A, B, C):
if n == 1:
print("Move disk 1 from", A, "to", C)
return
hanoi(n-1, A, C, B) # 将上面n-1个
盘子从A移动到B
print("Move disk", n, "from", A, "to", C) # 将最大的盘子从A移动到C
hanoi(n-1, B, A, C) # 将B上的n-1个盘子移动到C
# 测试代码
hanoi(3, "A", "B", "C")
在上述代码中,我们定义了一个名为hanoi的函数来解决汉诺塔问题。
该函数接受四个参数:n表示圆盘的数量,A、B、C表示三个柱子的名称。
在程序的主体部分,我们首先判断如果n等于1时,即只有一个圆盘,直接将其从柱子A移动到柱子C。
如果n大于1时,即有多个圆盘,我们首先将上面n-1个圆盘从柱子A移动到柱子B,然后将最大的圆盘从柱子A移动到柱子C,最后再将B柱上的n-1个圆盘移动到柱子C。
这样,我们就成功将n个圆盘从柱子A移动到柱子C。
运行结果
对于n等于3的情况,我们可以得到以下输出结果:
Move disk 1 from A to C
Move disk 2 from A to B
Move disk 1 from C to B
Move disk 3 from A to C
Move disk 1 from B to A
Move disk 2 from B to C
Move disk 1 from A to C
根据输出结果,我们可以看到每一步移动都符合汉诺塔问题的规则,最终成功将三个圆盘从柱子A移动到柱子C。
结论
通过编写并运行以上代码,我们成功解决了汉诺塔问题。
通过递归算法的思想,我们可以把大问题转化为小问题,简化了求解过程,在一定程度上提高了代码的可读性和可维护性。
总结起来,汉诺塔问题是一个经典的递归问题,适合用来练习递归算法的思维方式。
希望通过本文的介绍,能够对你理解递归算法的应用和Python编程有所帮助。
让我们一起探索更多有趣的问题和解决方法!。