递归(1)

本文介绍了递归算法的基本概念,通过具体实例解释了递归的工作原理,包括如何将问题分解为子问题,以及如何设定递归的终止条件。并提供了求和及斐波那契数列的递归实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归简介

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

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

举例说明

求和:如求列表ls = [1, 3, 4, 7, 8]的和

分析:在不采用循环和枚举的情况下,两个数相加是从接触数学来最初的求解方式,列表ls里面包含多个值,那么如何可以将之转换为两个值相加呢?

分解过程:
sum(ls)=sum(ls[:4])+8sum(ls) = sum(ls[:4]) + 8sum(ls)=sum(ls[:4])+8
sum(ls[:4])=sum(ls[:3])+7sum(ls[:4]) = sum(ls[:3]) + 7sum(ls[:4])=sum(ls[:3])+7
sum(ls[:3])=sum(ls[:2])+4sum(ls[:3]) = sum(ls[:2]) + 4sum(ls[:3])=sum(ls[:2])+4
sum(ls[:2])=sum(ls[:1])+3sum(ls[:2]) = sum(ls[:1]) + 3sum(ls[:2])=sum(ls[:1])+3
sum(ls[:1])=1sum(ls[:1]) = 1sum(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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值