递归(1)

递归简介

递归是一种解决问题的的方法,思路在于将问题分解为规模更小的相同问题,持续分解,知道问题规模小到可以用非常简单直接的方式来解决。

在使用中,简单来说便是自己调用自己。

举例说明

求和:如求列表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

猜你喜欢

转载自blog.csdn.net/Zeus_daifu/article/details/128435861
今日推荐