题目
一直Fibonacci数列,输入n,用最快的方式求改该数列的第n项。
解法
1. 递归方法。这是一个经典的递归求解方法,我们知道Fibonacci数列的递归式为F(n) = F(n-1)+F(n-2)。这样就可以使用递归的方式求得该数列的第n项。但这种方式总是在计算重复的值,例如计算F(8)时计算了F(1)到F(7),而计算F(9)时有计算了一遍F(1)到F(8),其中F(1)到F(7)重复计算了多次,这样会导致运行效率很低。
2. 非递归的方式,使用动态规划的思想,自底向上计算每一项的值,这样就避免了多个元素的重复计算。可以节省很多时间,时间复杂度为O(n)。
3. 还有一种更快的方法,时间复杂度为O(nlgn)。
递归方式
FIBONACCI-N(int n):
if n == 1 or n == 2:
return 1;
else
return FIBONACCI-N(n-1) + FIBONACCI-N(n-2)
非递归方式
FIBONACCI-INTERVAL(int n):
if n == 1 or n == 2:
return 1;
int minus_one = 1;
int minus_two = 1;
int result = 0;
for i = 3 to n:
result = minus_one + minus_two;
minus_two = minus_one;
minus_one = result;
return result;
在自底向上计算第n项的值的循环中,计算完当前result值后,使用minus_one的值更新minus_two,并用result的值更新minus_one,这样就可以自底向上的逐步计算出第n项的值。