python函数(3)—— 递归
前面我们将了函数调用,那是一个函数调用另外一个函数,那我们能不能让函数调用它们自己呢?
函数作为一种代码封装,可以被其他程序调用,当然,也可以被函数内部代码调用。这种函数定义中调用函数自身的方式称为递归。
目录
一、定义:
二、递归思想
三、例题实操应用
1、求和(0~n)
2、求积(1~n)
3、实现斐波那契数列 这个数列从第3项开始,每一项都等于前两项之和
4、跳楼梯问题 一次走一阶或两阶楼梯 问走法几种:
5、不死兔子问题
6、汉诺塔问题:
三、总结:
一、定义:
是指在函数的定义中使用函数自身的方法
它至少有一个明确的递归结束的条件(否则就是一个死循环),能给出递归终止的处理方法,每次进入更深一层递归时,问题规模(计算量)相比上次递归都应有所减少。
二、递归思想
1、找到递归关系(数列相邻几项直接的关系),将一个复杂问题转换为与之形式相似,但规模较小的问题
2、找到递归出口,即问题转换时,当规模足够小,可直接求解
三、例题实操应用
1、求和(0~n)
def sum_num(n: int):# 递归一定要有终止条件,否则就是一个死循环if n == 0:return 0return n + sum_num(n - 1)count = sum_num(100)
print(count)
2、求积(1~n)
def product_num(n: int):if n == 1:return 1else :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 1if 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 nelse: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 1else:return rabbit(n-1) +rabbit(n-4)
print(rabbit(14))
6、汉诺塔问题:
def tower(n):'''汉诺塔问题,(三根柱子,所有的块都在一根柱子上,其他两根柱子上没有块,且小块只能放在大块上),问将一根柱子上的所有块全部移动到另一根柱子上的步数是多少?'''if n == 1:return 1else:return 2 * tower(n - 1) +1n = int(input("请输入一个整数"))
move_count = tower(n)
print(f"要将{n}块移动到另外一根柱子上需要{move_count}步")
三、总结:
通过以上六个例题,我们能发现运用递归思路能很容易解决比较难处理的问题。
毕竟人无完人,递归也是有确定的,它不可能一直递归下去,并且当输入的值太大,递归次数太多时,python 都会报错。
为了避免“无限”调用导致堆栈溢出,python解释器会限制递归次数,默认可递归次数为1000(超过1000次就会报错,实际一般在996到998这个范围附近的次数就会报错)。
本文参考:【Python函数的递归】_python递归函数_W_chuanqi的博客-CSDN博客
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
