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算法资讯。