Python|如何用递归解决汉诺塔问题?

简介: Python|如何用递归解决汉诺塔问题?

问题描述

n个大小不同的圆盘按照从小到大的顺序放在A柱子上,要求每次搬动1个圆盘,且在搬动过程中,大圆盘在下,小圆盘在上,将所有圆盘从A柱子移动到C柱子,中间可以借助B柱子,请实现搬动过程。

解决方案

1 如果只有一个圆盘

直接从A柱子搬动到C柱子:A->C

2 如果有2个圆盘

上面小圆盘直接从A搬动到B柱子暂放:A->B;下面大圆盘直接从A搬到C柱子:A->CB暂放的小圆盘直接搬到C柱子:B->C

3 如果有3个圆盘

上面2个小圆盘从A搬动到B柱子暂放:H(2,A)->B(A->C;A->B;C->B)

下面大圆盘直接从A搬到C柱子:A->C

B暂放的2个小圆盘搬动到C柱子:H(2,B)->CB->A;B->C;A->C)。

4 规律

1个圆盘直接搬动:原柱子->目的主子;多个圆盘采用汉诺塔搬动方法:圆盘数量,原柱子,目的柱子。

代码示例:

def hano(n,a,b,c):

#用汉诺塔方法将n个圆盘从a柱子移动到c柱子

if(n<1):

print('圆盘数量错误')

return

if(n==1):

print('{}:{}->{}'.format(n,a,c))

return

hano(n-1,a,c,b)#n-1个圆盘先移动到b柱子

print('{}:{}->{}'.format(n,a,c))#移动最大的那个圆盘

hano(n-1,b,a,c)#n-1个b柱子的圆盘移动到c柱子

hano(4,'a','b','c')

结语

所以得出n个圆盘要搬动2的n次方-1次。其实递归就是直接或间接的调用函数本身,递归主要应用于具有递归关系的问题或者原始问题较复杂,很难求解,但数据量很小容易求解,且大问题和小问题具有相似性。递归可以解决阶乘、汉诺塔等简单问题,也可以用来解决绘制英式标尺等较复杂的问题。

目录
相关文章
|
8天前
|
算法 Python
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果
在Python编程中,分治法、贪心算法和动态规划是三种重要的算法。分治法通过将大问题分解为小问题,递归解决后合并结果;贪心算法在每一步选择局部最优解,追求全局最优;动态规划通过保存子问题的解,避免重复计算,确保全局最优。这三种算法各具特色,适用于不同类型的问题,合理选择能显著提升编程效率。
25 2
|
1月前
|
Java 程序员 C++
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
23 0
【Python】链式、嵌套调用、递归、函数栈帧、参数默认值和关键字参数
|
3月前
|
算法 Python
python函数递归和生成器
python函数递归和生成器
|
3月前
|
算法 数据挖掘 Python
|
3月前
|
数据采集 Java Python
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
python 递归锁、信号量、事件、线程队列、进程池和线程池、回调函数、定时器
|
4月前
|
缓存 Python
Python中递归错误
【7月更文挑战第17天】
48 8
|
4月前
|
算法 Python
python中算法递归错误(Recursion Errors)
【7月更文挑战第18天】
69 1
|
4月前
|
搜索推荐 Python
快速排序:Python 中的速度之王,揭秘它的递归魔法与性能极限!
【7月更文挑战第12天】快速排序**是高效排序算法,基于分治策略。它选择基准值,将数组分成小于和大于基准的两部分,递归地对两部分排序。
60 6
|
4月前
|
存储 缓存 算法
python中递归深度超限(RecursionError)
【7月更文挑战第15天】
111 1
|
5月前
|
分布式计算 算法 Python
Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解
Python函数进阶:四大高阶函数、匿名函数、枚举、拉链与递归详解