实现泰波纳契数列的时候,用寻常的写法效率很低,
class Solution:
def tribonacci(self, n: int) -> int:
dp = [0 for i in range(n+1)]
if len(dp) == 1:
return 0
elif len(dp) == 2 or len(dp) == 3:
return 1
else:
dp[0] = 0
dp[1] = 1
dp[2] = 1
for i in range(3, n+1):
dp[i] = dp[i-1] + dp[i-2] + dp[i-3]
return dp[n]
有另一种更高效的写法:
class Solution:
def tribonacci(self, n: int) -> int:
fn = lambda n, t3: t3[n] if n < 3 else fn(n - 1, t3[1:] + (sum(t3),))
return fn(n, (0, 1, 1))
首先,使用了一个匿名函数lambda(), 原来可以直接用fn传参, 当n<3的时候直接调用t3, 当n>3的时候,想将后面的归纳到0-2, 因此传入的参数需要改变,n不变, 三元元组变为f1, f2还有f0+f1+f2因此使用t3[1:] + (sum(t3), ), 加一个逗号是为了表示这是一个元组, 将t3[1:]进行拼接, 因为t3本来就是元组, 所以可以直接这么拼接。
为什么是f(n-1)呢?
是为了让n逐渐减小直到n<3, 但是这个不是fib(3)而是经过t次计算之后的值,这个就相当于设定了一个循环变量,每次减1,都相当于往前计算一个值。相当于距离那个窗口的距离,每次-1都离窗口边缘更近一步