题目描述
N <= 39
一看到这个题目最先想到的解法就是用递归,因为我们在学习Ç语言的时候教材在讲解递归这一知识的时候就是用的这个例子,虽然经常用这个问题来讲解递归函数,但是这不代表递归的解法最适合这道题目,一般在面试的时候,面试官会提示我们上述递归解法有很严重的效率问题并要求我们分析原因。
在剑指提供这本书中给了一个例子,即求F(10),要想求F(10)必须先求F(9)和F(8)。同样要想求F(9)必须要求F(7)和F(8)......一次类推我们可以发现,这其中有很多数我们都是要反复计算求解的,而且随着ñ的增大,计算量会急剧增大。事实上,用递归的方法计算的时间复杂度是以ñ的指数的方式递增的。
比较简单的解法:从下往上计算,先根据F(0)F(1)算出F(2),再由F(1)和F(2)算出F(3).......依此类推就可以直接算出F(N)了,这种算法的时间复杂度是O(N)。
-------------------------下面是我的python代码------------------- -----
class Solution:
def Fibonacci(self, n):
# write code here
if n <= 0:
return(0)
elif n == 1or n == 2:
return(1)
else:
a = 1
b = 1
for i in range(2,n):
c = a+b
a = b
b = c
return(c)
------------------------------- python 2 ----------------- ---------------
# -*- coding:utf-8 -*-
class Solution:
def Fibonacci(self, n):
# write code here
if n==0:
return(0)
elif n==1:
return(1)
else:
s = []
for i in range(n):
if i==0:
s.append(1)
elif i==1:
s.append(1)
else:
s.append(s[i-1]+s[i-2])
return(s[n-1])
另外,在剑指提供一书中还指出了另外一种时间复杂度更小的解法 o(logn),利用一个数学公式:
有了这个公式,只需我们求得即可得到F(N)那么这个矩阵如何求解呢(利用乘方的性质)。?:
从上面公式中,我们可以看出,相求的Ñ次方,就要先求得的n / 2次方,再把的n / 2次方的结果平方以下即可。这个可以用递归来实现。