【题目】
- 给定整数N,返回斐波那契数列的第N项
- 假设农场中成熟的母牛每年只会生一头小母牛,并且永远不会死。第一年农场有1只成熟的牛,从第二年开始,母牛开始生小母牛。每只小母牛3年之后 成熟又可以生小母牛。给定整数N,返回N年后牛的数量。
【基本思路】
原问题。O(2^N)的方法。斐波那契数列为1,1,2,3,5,8……,也就是除第一项和第二项以外,对于第N项,有F(N) = F(N-1) + f(N-2),于是可以很轻松的写出暴力递归的代码。下面是使用python3.5实现的代码:
递归。时间复杂度(2^N)
def fibonacci1(n):
if n < 1:
return 0
if n == 1 or n == 2:
return 1
return fibonacci1(n-1) + fibonacci1(n-2)
O(N)的方法。斐波那契可以从左到右依次求出每一项的值,那么可以顺序计算求到第N项即可。下面是使用python3.5实现的代码:
递归。时间复杂度(2^N)
def fibonacci2(n):
if n < 1:
return 0
if n == 1 or n == 2:
return 1
pre = 1
cur = 1
for i in range(3, n+1):
tmp = cur
cur = pre + cur
pre = tmp
return cur
O(logN)的方法。矩阵乘法推导如下(字丑见谅)
所以现在的问题就变成了如何使用最快的方法求一个矩阵的N次方,而求一个矩阵的N次方明显可以在O(logN)时间内完成。为了表述方便,现在使用一个整数N次方的例子来说明,矩阵的求解过程类似。
假设一个整数是10,如何快速的求解10的75次方。
75的二进制形式为1001011.
10的75次方 = 1064∗108∗102∗