Python之递归(含斐波那契数列和汉诺塔)

Python递归

一.什么是递归?
递归就是在调用一个函数的过程中,直接或者间接的调用函数自身这就叫递归。
二.实例
这里讲一下递归的注意点:
(1)调用一次函数就会在内存里开辟栈帧空间,在调用结束后,再释放栈帧空间
(2)(回的过程)在最后一层栈帧空间调用结束之后,要回到上一层栈帧空间去,从函数调用的那个位置,往下继续执行未完成的代码,直到结束,继续往上返回,依次类推,直到所有栈帧空间释放完毕
(3)写递归函数的时候,切记给出跳出的条件,预防内存溢出报错,如果递归的层数过多,不推荐使用

def digui(n):
    print(n,"<==1==>")
    if n>0:         #使其一直调用自身,直到n=0为止
        digui(n-1)
    print(n,"<==2==>")
digui(5)

代码解析:
(递归去的过程)
n = 5 print(5) digui(5-1) => digui(4) 暂停在第4行代码上
n = 4 print(4) digui(4-1) => digui(3) 暂停在第4行代码上
n = 3 print(3) digui(3-1) => digui(2) 暂停在第4行代码上
n = 2 print(2) digui(2-1) => digui(1) 暂停在第4行代码上
n = 1 print(1) digui(1-1) => digui(0) 暂停在第4行代码上

n = 0 print(0,"<1>")
发现0>0 为假 不执行里面的递归

执行5行 print(0,"<2>")

(递归回的过程)
如果代码全部执行完毕,有回的过程,回到上一次函数调用的位置
n = 1 print(1) digui(1-1) => digui(0) 从第4行,继续向下执行,print(1,"<2>")
n = 2 print(2) digui(2-1) => digui(1) 从第4行,继续向下执行,print(2,"<2>")
n = 3 print(3) digui(3-1) => digui(2) 从第4行,继续向下执行,print(3,"<2>")
n = 4 print(4) digui(4-1) => digui(3) 从第4行,继续向下执行,print(4,"<2>")
n = 5 print(5) digui(5-1) => digui(4) 从第4行,继续向下执行,print(5,"<2>")

最后结果: 5 4 3 2 1 0 0 1 2 3 4 5


斐波那契数列

斐波那契数列是由1,1开始,下一个数是前两个数的和。如:
1,1,2,3,5,8,13,21…
还有一种说法是从0,1开始。这里我们有两个版本的例子。

#从1,1开始
def feibo(n):
    if n ==1 or n==2:
        return 1            
    return feibo(n-1) + feibo(n-2)
re = feibo(5)       #第5个数  5
print(re)
#从0,1开始
def feibo():    #从第n次相加
    if n<=2:
        return n
    return feibo(n-1)+feibo(n-2)
re = feibo(5)       #8
print(re)

汉诺塔游戏外挂
  • 汉诺塔背景
    汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
    汉诺塔
  • 游戏大概讲解
    以三层汉诺塔为例:从上到下从大到小依次为A,B,C.柱子序号从左到右依次为1,2,3.我们要做的是将最大的C移动到3号柱子上,但在这之前需要把A,B圆盘按从大到小的顺序摆放在2号柱子上,然后移动C,再B以上的所有圆盘移动到1号柱子上,最后将最小的A移动到3号柱子上结束游戏。
    所以多层汉诺塔原理一样,需要把最大的圆盘以上的圆盘按规则移动到2号柱子,然后移动目标圆盘。接着重复之前的操作,来来回回直到最后一个圆盘移动到3号柱子。每次移动一层是上一次以及之前的步数之和。
  • 汉诺塔游戏代码实现
i=0
def move(n,a,b,c):      # n层汉诺塔,柱子从左到右为a,b,c的形参    
    global i    
    if n==1:
        i+=1        
        print('移动第%d次\t'%i,a+'-->'+c)    
    else:        
        #将最大的一个之上的所有移到B上,C为中转柱子        
        move(n-1,a,c,b)        
        #将最大的移到C上,B为中转柱子        
        move(1,a,b,c)        
        #将B上的移到到C上完成汉诺塔的叠加,A为中转柱子                  move(n-1,b,a,c)
move(3,'A','B',"C")     #传入参数  5层,以及A,B,C柱子

手里有汉诺塔的小伙伴可以试一试啦,绝对是最快的作弊器(手动狗脸)

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值