前面我们将了函数调用,那是一个函数调用另外一个函数,那我们能不能让函数调用它们自己呢?
函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。
目录
3、实现斐波那契数列 这个数列从第3项开始,每一项都等于前两项之和
一、定义:
是指在函数的定义中使用函数自身的方法
它至少有一个明确的递归结束的条件(否则就是一个死循环),能给出递归终止的处理方法,每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少。
二、递归思想
1、找到递归关系(数列相邻几项直接的关系),将一个复杂问题转换为与之形式相似,但规模较小的问题
2、找到递归出口,即问题转换时,当规模足够小,可直接求解
三、例题实操应用
1、求和(0~n)
def sum_num(n: int):
# 递归一定要有终止条件,否则就是一个死循环
if n == 0:
return 0
return n + sum_num(n - 1)
count = sum_num(100)
print(count)
2、求积(1~n)
def product_num(n: int):
if n == 1:
return 1
else :
return n * product_num(n - 1)
n = int(input("输入一个正整数"))
product = product_num(n)
print(f"1~{n}的积为{product}")
3、实现斐波那契数列 这个数列从第3项开始,每一项都等于前两项之和
def fibo(n: int) -> int: #返回值为int类型
if n <= 2:
return 1
if n > 2 :
return fibo(n-1) + fibo(n-2)
n = int(input("输入一个正整数"))
fibo_num = fibo(n)
print(f"斐波那契数列第{n}项的值为{fibo_num}")
4、跳楼梯问题 一次走一阶或两阶楼梯 问走法几种:
def jump_stair(n: int):
if n == 1 or n == 2:
return n
else:
return jump_stair(n-1)+jump_stair(n-2)
print(jump_stair(3))
print(jump_stair(10))
5、不死兔子问题
def rabbit(n):
'''
求不死神兔的数量,一对兔子四个月成熟期后生小兔子,
之后每个月都会生一对小兔子,
每一对小兔子过成熟期四个月之后还会再生小兔子,
问 n 个月后兔子的对数的多少?
'''
if n <= 4:
return 1
else:
return rabbit(n-1) +rabbit(n-4)
print(rabbit(14))
6、汉诺塔问题:
def tower(n):
'''
汉诺塔问题,
(三根柱子,所有的块都在一根柱子上,其他两根柱子上没有块,且小块只能放在大块上)
,问将一根柱子上的所有块全部移动到另一根柱子上的步数是多少?
'''
if n == 1:
return 1
else:
return 2 * tower(n - 1) +1
n = int(input("请输入一个整数"))
move_count = tower(n)
print(f"要将{n}块移动到另外一根柱子上需要{move_count}步")
三、总结:
通过以上六个例题,我们能发现运用递归思路能很容易解决比较难处理的问题。
毕竟人无完人,递归也是有确定的,它不可能一直递归下去,并且当输入的值太大,递归次数太多时,python 都会报错。
为了避免“无限”调用导致堆栈溢出,python解释器会限制递归次数,默认可递归次数为1000(超过1000次就会报错,实际一般在996到998这个范围附近的次数就会报错)。