题目描述:
写一个函数,输入 n ,求斐波那契(Fibonacci)数列的第 n 项。斐波那契数列的定义如下:
F(0) = 0, F(1) = 1
F(N) = F(N - 1) + F(N - 2), 其中 N > 1.
斐波那契数列由 0 和 1 开始,之后的斐波那契数就是由之前的两数相加而得出。答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。
示例 1:
输入:n = 2
输出:1
示例 2:
输入:n = 5
输出:5
解题思路1:
递归方法
代码1: 超出时间限制
Python写法:
class Solution(object):
def fib(self, n):
if n == 0: return 0
if n == 1: return 1
return self.fib(n-1) + self.fib(n-2)
C语言写法:
int fib(int n)
{
if (n < 2)
return n;
else
return fib(n-1) + fib(n-2);
}
int main()
{
int n,c;
scanf("%d", &n);
c = fib(n);
printf("%d\n", c);
return 0;
}
解题思路2: 动态规划
以斐波那契数列性质 f(n + 1) = f(n) + f(n - 1)为转移方程。
代码2.1:
class Solution:
def fib(self, n):
num = {} # 体会字典的魅力
num[0] = 0
num[1] = 1
if n > 1:
for i in range(2,n+1):
num[i] = num[i-2] + num[i-1]
return int(num[n]%(1000000007))
代码2.2:
class Solution:
def fib(self, n):
a = 0
b = 1
for i in range(n):
a,b = b,a+b
return a % 1000000007 # return int(a % int(1e9+7))
C语言写法:
#include <stdio.h>
int fib(int n)
{
int a,b,t,i;
a = 0;
b = 1;
for(i=0;i<n;i++)
{
t = b;
b = a+b;
a = t;
}
return a;
}
int main()
{
int n,c;
scanf("%d", &n);
c = fib(n);
printf("%d\n", c);
return 0;
}
解题思路3: 递归 + lru_cache
来源于: Python3 lru_cache
装饰器@lru_cache的用法:
一个为函数提供缓存功能的装饰器,缓存 maxsize 组传入参数,在下次以相同参数调用时直接返回上一次的结果,避免传入相同的参数时重复计算。 用以节约高开销或I/O函数的调用时间。 maxsize 设置为None ,LRU(least recently used即最近最少使用原则)功能将被禁用且缓存数量无上限
代码3:
class Solution:
import functools
@functools.lru_cache(None)
def fib(self, n):
return n if n < 2 else (self.fib(n-1) + self.fib(n-2))%1000000007
题目来源: