ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

递归思想

2020-03-11 17:04:02  阅读:272  来源: 互联网

标签:递归 思想 圆盘 hanoi fib 汉诺塔 移动


1.介绍
       普通的程序员使用迭代,天才程序员使用递归。什么是递归?下面这个图很形象地表现了递归思想。递归的标准定义是这样的,递归算法(recursion algorithm)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。
在这里插入图片描述
2.举例
①斐波拉契数列,第一项和第二项为1,后面的使用以下递推式来求取。
在这里插入图片描述
其实现代码如下

def fib(x):
    if x < 2:
        if x==0:
            return 0
        else:
            return 1
    else:
        return fib(x-1)+fib(x-2)
print(fib(5))

②汉诺塔
       最近在学习python,看到小甲鱼视频里面递归的地方举的汉诺塔的例子,觉得很神奇,实在是妙,因此记录下来。汉诺塔相信大家都玩过,其规则就不说了。说一下玩这个游戏的中心思想,要想实现圆盘从X到Z的移动,且在移动过程中遵守规则(大的圆盘不能放在小的圆盘上面),实质上就是以下三个步骤(这里以7个为例):
(1)将X上的前6个圆盘移到Y上;
(2)将X上剩下的一个最底下的圆盘移到Z上;
(3)将Y上剩下的6个圆盘移到Z上。
在这里插入图片描述
这里来分析一下,在上述的步骤一中要实现X上六个圆盘移动到Y上,这一过程又可以分解为先将前5个移动到Z上,剩下的第六个移动到Y上,再将Z上的五个移动到Y上。这个过程是否很熟悉,是的,和上述三个步骤一样的操作。因此我们只需要递归调用第一个步骤就能实现最后的结果。
具体代码如下:

def hanoi(n, x, y, z):
    if n==1:
        print(x, '-->', z)
    else:
        hanoi(n-1, x, z, y)#将前n-1个圆盘从X移动到Y
        print(x, '-->', z)#将X的最底下的最后一个圆盘移到Z
        hanoi(n-1, y, x, z)#将X的最底下的最后一个圆盘移到Z
n=int(input('请输入汉诺塔层数:'))
hanoi(n,'X','Y','Z')

在这里插入图片描述
输出结果就是实现步骤,不得不说代码很简洁,当时看到代码就像知道整个运行过程具体是怎样的,后来想明白了,以n=3为例,其过程如下:
(1)先判断n是否为1,不为1执行hanoi(2,x,z,y)(2)执行hanoi(2,x,z,y),n又不为1,执行hanoi(1,x,y,z),注意调换y,z(3)执行hanoi(1,x,y,z),此时n=1,打印X-->Z,

标签:递归,思想,圆盘,hanoi,fib,汉诺塔,移动
来源: https://blog.csdn.net/weixin_42462495/article/details/104798202

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有