一.定义
已知:函数可以调用函数
结论:一个函数在内部调用自己本身,这个函数就是递归函数。
明确两点:
(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个斐波那契数为: 5
第8个斐波那契数为: 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次