Python:递归函数(斐波那契、汉诺塔)

1,递归
理解:
假设要从一个盒子中找到唯一一把钥匙;
第一步:创建盒子,打开盒子
第二步:如果盒子里面有一个或多个小盒子,选一个打开;
第三步:如果找到了钥匙,停止。如果没有找到就调用第二步 的步骤
第三步,若有个盒子为空(没有钥匙也没有盒子),选择另一个大盒子

在这里插入图片描述,2,基线条件与递归条件
递归必须要知道何时停止,以不至于无限循环,
即函数不在调用自己:基线条件
函数调用自己:递归条件

3,递归特性:
1) 必须有一个明确的结束条件
2) 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3)递归效率不高,递归层次过多会导致栈溢出(在计算机中,
函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,
栈就会加一层栈帧,
每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,
递归调用的次数过多,会导致栈溢出)
定义时小括号中的参数,用来接收参数用的,称为 “形参”
调用时小括号中的参数,用来传递给函数用的,称为 “实参

例1 求5的阶乘:

def jiecheng(n):
    if n==0:  #基线条件
        return 1
    else:   #递归条件
        return n*jiecheng(n-1)   
print(jiecheng(5)) # print(jiecheng(10000) 栈溢出,报错

例2 斐波那契

def fbnq(n):
    if n==1 or n==2:
        return 1
    else:
        return fbnq(n-1)+fbnq(n-2)
for i in range(1,13):
    print('第%d个月的兔子数'%i,fbnq(i))

输出:
第1个月的兔子数 1
第2个月的兔子数 1
第3个月的兔子数 2
第4个月的兔子数 3
第5个月的兔子数 5
第6个月的兔子数 8
第7个月的兔子数 13
第8个月的兔子数 21
第9个月的兔子数 34
第10个月的兔子数 55
第11个月的兔子数 89
第12个月的兔子数 144

例3:汉诺塔

在这里插入图片描述

def hanoi(n,A,B,C):  #n为圆盘个数  ,A,B,C为三个柱子
    if n==1:
        print(A,'-->',C)
    else:
        hanoi(n-1,A,C,B)
        hanoi(1,A,B,C)
        hanoi(n-1,B,A,C)
hanoi(3,"a","b","c")

输出:
a --> c
a --> b
c --> b
a --> c
b --> a
b --> c
a --> c

总移动数为 2^n - 1.

猜你喜欢

转载自blog.csdn.net/aixiangnan/article/details/88859361