【Python数据结构与算法】--- 递归算法应用-五行代码速解汉诺塔问题.

简介: 【Python数据结构与算法】--- 递归算法应用-五行代码速解汉诺塔问题.



汉诺塔

两层汉诺塔的演示

三层汉诺塔的走法演示

我不知道有没有朋友跟我一样有一个疑问,如果我们顶端的先放到中间柱子呢?

但是实际上汉诺塔问题解决方案都是最优解,我们不走弯路,我们的目的性非常强,我们最终目的都是移动到c,所以我们可以先让顶端的木块直接到c

解题思路:

不妨将这个问题拆解,n个汉诺塔,我们可以把最底下最大那个看成单独的一个,上面的(n - 1)个,看成一个整体.这样子最底下那个可以直接从 A 移动到 C,剩下上面的 ( n - 1 ) 个汉诺塔我们可以先从A 通过 C 移动到 B . 再从B通过 A 移动到 C.  

这样子不断进行递归,问题规模就可以逐层减小.

代码:

def hanoi(n,a,b,c):#n为层数 a,b,c是杆子
    if n>0:
        #将中间 n - 1 个盘子当成一个整体,通过c盘从a移动到b盘
        hanoi(n-1,a,c,b) # 中间柱子变目标
        print("Moving  from %s to %s" %(a,c)) # 对应一个柱子的时候
        hanoi(n-1,b,a,c) # 最后一个柱子变成目标
hanoi(1,"A","B","C")

运行结果:


青蛙跳台阶

总结一下规律:

我们可以发现

跳  n 个台阶的台阶数对应的跳法 = 跳 (n - 1)个台阶时候的跳法 + 跳 (n - 2)个台阶时候的跳法.

这有点像我们的斐波那契数列.

青蛙跳台阶的问题相当于动态规划的问题 .

动态规划:用上一步的结果,来快速计算得到下一步的结果.

递归的思路:

当只有1个台阶时,只有一种跳法;当有2个台阶时,有两种跳法;当台阶数大于2时,青蛙可以选择跳一步到第n-1个台阶,也可以选择跳两步到第n-2个台阶,所以总的跳法数是跳到第n-1个台阶的跳法数加上跳到第n-2个台阶的跳法数。

这里是青蛙跳台阶的Python递归实现

def frog_jump(n):
    if n == 1:
        return 1
    elif n == 2:
        return 2
    else:
        return frog_jump(n-1) + frog_jump(n-2)

其中,n表示台阶数,函数返回青蛙跳到第n个台阶的跳法数。

需要注意的是,这种递归实现虽然简单易懂,但是时间复杂度为指数级别的,所以不能用于大规模的数据处理。

目录
相关文章
|
2天前
|
机器学习/深度学习 人工智能 算法
机械视觉:原理、应用及Python代码示例
机械视觉:原理、应用及Python代码示例
|
2天前
|
存储 缓存 算法
优化Python代码性能的7个技巧
在日常的Python开发中,优化代码性能是一个重要的课题。本文介绍了7个实用的技巧,帮助开发者提高Python代码的执行效率,包括利用生成器表达式、使用适量的缓存、避免不必要的循环等。通过本文的指导,读者可以更好地理解Python代码性能优化的方法,提升自身的编程水平。
|
2天前
|
安全 前端开发 JavaScript
在Python Web开发过程中:Web框架相关,如何在Web应用中防止CSRF攻击?
在Python Web开发中防范CSRF攻击的关键措施包括:验证HTTP Referer字段、使用CSRF token、自定义HTTP头验证、利用Web框架的防护机制(如Django的`{% csrf_token %}`)、Ajax请求时添加token、设置安全会话cookie及教育用户提高安全意识。定期进行安全审计和测试以应对新威胁。组合运用这些方法能有效提升应用安全性。
8 0
|
3天前
|
算法 数据可视化 Python
Python用MCMC马尔科夫链蒙特卡洛、拒绝抽样和Metropolis-Hastings采样算法
Python用MCMC马尔科夫链蒙特卡洛、拒绝抽样和Metropolis-Hastings采样算法
14 6
|
4天前
|
机器学习/深度学习 算法 搜索推荐
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
Python用机器学习算法进行因果推断与增量、增益模型Uplift Modeling智能营销模型
31 12
|
4天前
|
缓存 人工智能 API
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
【Python+微信】【企业微信开发入坑指北】2. 如何利用企业微信API主动给用户发应用消息
8 0
|
4天前
|
人工智能 Python
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
【Python实用技能】建议收藏:自动化实现网页内容转PDF并保存的方法探索(含代码,亲测可用)
22 0
|
4天前
|
人工智能 Python
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
【AI大模型应用开发】【LangChain系列】实战案例1:用LangChain写Python代码并执行来生成答案
9 0
|
4天前
|
算法 Python
Python 一步一步教你用pyglet制作汉诺塔游戏
Python 一步一步教你用pyglet制作汉诺塔游戏
16 0
|
4天前
|
Linux 网络安全 开发工具
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
【超详细!超多图!】【代码管理】Python微信公众号开发(3)- 服务器代码上传Github
10 0