函数-递归函数

一.定义

已知:函数可以调用函数
结论:一个函数在内部调用自己本身,这个函数就是递归函数。
明确两点
(1)递归退出的条件
(2)递归的规则

#递归计算阶乘
def highpow(num):
    """通过递归求阶乘"""
    #递归退出的条件:num<=1
    #阶乘循环的内容:num!=num*(num-1)
    if num >1:
        result=num*highpow(num-1)
    else:
        result=1
    return result
if __name__ == '__main__':
    print(highpow(4))

结果

24

二.案例

1.递归实现斐波那契数列

斐波那契数列(Fibonacci sequence),又称黄金分割数列,指:1、1、2、3、5、8、13、21、34…
在数学上,斐波那契数列有如下地推的方法定义:
F(1)=1,F(2)=1,F(n)=F(n-1)+F(n-2) (n>=3,n∈N*)

#递归实现斐波那契数列
def fib(num):
    # 递归退出条件:num=1或者num=2
    # 递归的规则:F(num)=F(num-1)+F(num-2)
    if num==1 or num==2:
        return 1
    else:
        return fib(num-1)+fib(num-2)
if __name__ == '__main__':
    print('第5个斐波那契数为:',fib(5))
    print('第8个斐波那契数为:',fib(8))

结果

5个斐波那契数为: 58个斐波那契数为: 21

2.递归实现汉诺塔问题

印度的古老传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。 印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就 是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片, 不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
在这里插入图片描述
以n = 2为例:
移动的过程如图,三个塔分别命名:satrt,cache,start
分为三步,类似与把大象装进冰箱
把大象装进冰箱:
(1)把冰箱门打开
(2)把大象装进去
(3)关上冰箱门
在这里,n-1代表冰箱门,1代表大象
(1)先将n-1从start移动到cache(打开门)
(2)将1从start移动到target (把大象装进去)
(3)将n-1从cache移动到target(关上门)

movement=0
def hanoi(n,start='A',cache='B',target='C'): #开始塔,缓存塔,目标塔
    #递归退出条件:n=1
    #递归的规则
    #第一步: 将n-1从start移动到cache,因此,此时的开始塔还是start,目标塔就变成了cache(先写出开始塔和目标塔的位置,剩下的那个是缓存) : hanoi(n-1,start,target,cache)
    #第二步: 将1从start移动到target,因此,此时的开始塔还是start,目标塔是target :  hanoi(1,start,cache,target)
    #第三步: 将n-1从cache移动到target,因此,此时的开始塔是cache,目标塔是target : hanoi(n-1,cache,start,target)
    if n==1:
        print('盘子从%s移动到%s'%(start,target))
        global movement
        movement+=1
    else:
        hanoi(n-1,start,target,cache)
        hanoi(1,start,cache,target)
        hanoi(n-1,cache,start,target)
if __name__ == '__main__':
    hanoi(4)
    print('一共移动了%s次'%(movement))

结果

盘子从A移动到B
盘子从A移动到C
盘子从B移动到C
盘子从A移动到B
盘子从C移动到A
盘子从C移动到B
盘子从A移动到B
盘子从A移动到C
盘子从B移动到C
盘子从B移动到A
盘子从C移动到A
盘子从B移动到C
盘子从A移动到B
盘子从A移动到C
盘子从B移动到C
一共移动了15
发布了36 篇原创文章 · 获赞 0 · 访问量 295

猜你喜欢

转载自blog.csdn.net/ANingL/article/details/103823504