递归简介
递归是一种解决问题的的方法,思路在于将问题分解为规模更小的相同问题,持续分解,知道问题规模小到可以用非常简单直接的方式来解决。
在使用中,简单来说便是自己调用自己。
举例说明
求和:如求列表ls = [1, 3, 4, 7, 8]的和
分析:在不采用循环和枚举的情况下,两个数相加是从接触数学来最初的求解方式,列表ls里面包含多个值,那么如何可以将之转换为两个值相加呢?
分解过程:
s u m ( l s ) = s u m ( l s [ : 4 ] ) + 8 sum(ls) = sum(ls[:4]) + 8 sum(ls)=sum(ls[:4])+8
s u m ( l s [ : 4 ] ) = s u m ( l s [ : 3 ] ) + 7 sum(ls[:4]) = sum(ls[:3]) + 7 sum(ls[:4])=sum(ls[:3])+7
s u m ( l s [ : 3 ] ) = s u m ( l s [ : 2 ] ) + 4 sum(ls[:3]) = sum(ls[:2]) + 4 sum(ls[:3])=sum(ls[:2])+4
s u m ( l s [ : 2 ] ) = s u m ( l s [ : 1 ] ) + 3 sum(ls[:2]) = sum(ls[:1]) + 3 sum(ls[:2])=sum(ls[:1])+3
s u m ( l s [ : 1 ] ) = 1 sum(ls[:1]) = 1 sum(ls[:1])=1
这样的逻辑便是递归的将问题分解为相同的小问题,分解完后然后小后往前计算,明显能看到分解问题有一个截止条件,则列表中仅有一个值的时候(当然求和并不需要这么复杂,只是为了解释递归的逻辑)。
代码
def get_sum(arr: list):
if len(arr) == 1:
return arr[0]
value = arr.pop()
_sum = get_sum(arr) + value
return _sum
if __name__ == '__main__':
ls = [1, 2, 3, 4, 5, 6]
print(get_sum(ls))
在编写递归代码时,需要注意两个问题:
- 停止条件
- 重复的规律
上式中,停止条件是当列表的长度为1时,重复的规律是当前列表最后一个数,加上其他列表的值(看成一个整体)。
斐波拉契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学、金融等领域,斐波那契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波那契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
分析
停止条件:
F(n)=F(n - 1)+F(n - 2),如果是从所以n从1开始,那么n-1>=0,n-2>=0,所有n>=3,所以停止条件便是n=1,2均为1。
重复规律:
F(n)=F(n - 1)+F(n - 2)
代码
def fibonacci(n):
if n in [1, 2]:
return 1
else:
return fibonacci(n - 1) + fibonacci(n - 2)
if __name__ == '__main__':
for i in range(1, 11):
print(fibonacci(i), end=' ')
输出
1 1 2 3 5 8 13 21 34 55