Python一行代码求解斐波那契数

1. 斐波那契数

斐波那契数是一系列数字,其中每个数字是前两个数字的总和。斐波那契数列中的第一个和第二个数都是1,后面的数是前两个数的和。
如下所示:

1 1 2 3 5 8 13 21 34 55

2. 问题抽象

我们需要完成的任务是编写一个函数fib,返回第n个fibonacci数,但必须在一行代码中完成。
一些测试用例:

fib(1) -> 1
fib(2) -> 1
fib(3) -> 2 (1+1)
fib(4) -> 3 (2+1)
fib(5) -> 5 (3+2)
fib(6) -> 8 (5+3)
fib(7) -> 13 (8+5)
fib(8) -> 21 (13+8)
fib(9) -> 34 (21+13)
fib(10) -> 55 (34+21)

3. 递归实现

观察上述题目要求后,我们首先不考虑1行代码的约束,我们先来完成最容易想到的递归实现,代码如下:

def fib(n):
    if n <= 2:
        return 1
    return fib(n-1) + fib(n-2)

解释:
我们知道斐波那契数为前两个数的和,也就是说:

fib(6) = fib(5) + fib(4)
fib(5) = fib(4) + fib(3)
fib(4) = fib(3) + fib(2)

我们将其抽象化,归纳为:

fib(n) = fib(n-1) + fib(n-2)

同时我们观察到,斐波那契数列前两项即当n小于等于2时,值均为1,所以我们可以很方便的实现相应的递归操作。

4. 转化为一行代码

经过上面的解释,相信大家对递归实现有了清楚的认识,接下来我们来将其转换为我们需要的一行代码。
转换前:

def fib(n):
    if n <= 2:
        return 1
    return fib(n-1) + fib(n-2)

转换后:

def fib(n): return 1 if n<=2 else fib(n-1) + fib(n-2)

5. 扩展

如果我们需要的不是仅仅返回第n项斐波那契数呢,如果将其修改为返回一个列表,列表里存放的是斐波那契数列中的前n项呢?
当然我们可以对递归操作,做简单的修改,代码如下:

def fib(n):
    if n == 1:
        return [1]
    if n == 2:
        return [1,1]
    last = fib(n-1)
    return last + [last[-1] + last[-2]]

有了上述的实现,我们接着将其转化为一行代码实现,代码如下:

def fib(n):return [1] if n==1 else [1,1] if n==2 else fib(n-1) + [fib(n-1)[-1]+fib(n-2)[-1]]

6. 总结

需要明确的是,上述相关一行函数的实现往往执行起来并不是最有效的(实际上运行效率极低),但我们将其进行改成一行代码的实现,可以加深我们对python相关语法的深刻理解,提升自己的编码能力。

在这里插入图片描述
关注公众号《AI算法之道》,获取更多AI算法资讯。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

赵卓不凡

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值