递归思想


之前一直不太理解递归,今天看了两篇文章,的确有所受益,这篇内容主要是笔记和个人总结。

1 一文学会递归解题

一文学会递归解题

这篇文章举的几个例子,对理解递归问题非常有帮助。最有帮助的是作者总结了一套递归方法,并在随后列举的足够多的例子中都用这种思想来解题,让读者有很高的接受效率。
首先对递归下定义,总结递归的特点:1.一个问题可以分解成具有相同解决思路的子问题,即这些问题都能调用同一个函数(即每一步都可以用同样的方法,可以说是一种循环);2经过层层分解的子问题,最后有一个不能再分解的固定值(终止条件)。
阐述递归解题的思路:1.先定义一个函数,明确这个函数的功能;2.寻找问题与子问题间的关系(即递推公式);3.将第二步的递推公式用代码表示出来补充到步骤 1 定义的函数中(可以算在第二步里);4.最后一步,根据问题与子问题的关系,推导出时间复杂度,如果发现递归时间复杂度不可接受,则需转换思路对其进行改造,看下是否有更靠谱的解法(这一步应该是进阶才需要考虑的_)。
所以思路简化一下就是两步:1.寻找问题的递归关系,并转化成公式;2.将公式转化成代码(定义为一个完整的函数)。

文章中的例子:

  1. 求阶乘(热身)
  2. 青蛙跳台阶(入门)——斐波那契数列
  3. 反转二叉树(初级题)
  4. 汉诺塔(中级题)
  5. 细胞分裂(进阶题)

2 python递归详解+汉诺塔小案例

python递归详解+汉诺塔小案例

汉诺塔算法介绍
其实算法非常简单,当盘子的个数为n时,移动的次数应等于2^n – 1(有兴趣的可以自己证明试试看)。后来一位美国学者发现一种出人意料的简单方法,只要轮流进行两步操作就可以了。首先把三根柱子按顺序排成品字型,把所有的圆盘按从大到小的顺序放在柱子A上,根据圆盘的数量确定柱子的排放顺序:若n为偶数,按顺时针方向依次摆放 A B C;
若n为奇数,按顺时针方向依次摆放 A C B。
⑴按顺时针方向把圆盘1从现在的柱子移动到下一根柱子,即当n为偶数时,若圆盘1在柱子A,则把它移动到B;若圆盘1在柱子B,则把它移动到C;若圆盘1在柱子C,则把它移动到A。
⑵接着,把另外两根柱子上可以移动的圆盘移动到新的柱子上。即把非空柱子上的圆盘移动到空柱子上,当两根柱子都非空时,移动较小的圆盘。这一步没有明确规定移动哪个圆盘,你可能以为会有多种可能性,其实不然,可实施的行动是唯一的。
⑶反复进行⑴⑵操作,最后就能按规定完成汉诺塔的移动。
所以结果非常简单,就是按照移动规则向一个方向移动金片:
如3阶汉诺塔的移动:A→C,A→B,C→B,A→C,B→A,B→C,A→C

代码:

#----------------汉诺塔-----------------#
# 如果有n个圆盘,所需移动的步数为 2^n-1
i = 0
# 定义一个函数给4个参数n是圆盘的个数,a代表A柱子,b,c 函数里面的是形式参数
def move(n,a,b,c):
    # 把变量i全局化,如果不全局化,只可访问读取不能进行操作修改
    global i
    if n==1:
        i += 1
        print('移动第',i,'次',a,'-->',c)
    else:
        # 1.把A柱上n-1个圆盘移动到B柱上
        move(n-1,a,c,b) # 传的才是实际参数
        # 2.把A柱上最大的移动到C柱子上
        move(1,a,b,c)
        # 3.把B柱子上n-1个圆盘移动到C柱子上
        move(n-1,b,a,c)

move(4,'A','B','C')

3 总结

递归方法即当前的方法可以用上一个方法实现,上一个方法可以用上上一个方法实现,一直追溯至第一步的方法。所以递归中每一步的方法是一样的,是不断套用的过程,套用的方法可以是一个或几个公式,也可以是步骤(比如汉诺塔)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值