题目:写一个函数,输入n,求斐波那契数列的第n项。
解法一(递归):效率低下,不太理想。
public long Fibonacci(int n)
{
if(n <= 0)
return 0;
if(n == 1)
return 1;
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
解法二(优化):实用解法,比较高效。
public long Fibonacci(int n)
{
int [] result = {0, 1};
if(n < 2)
return result[n];
long fibNMinusOne = 1;
long fibNMinusTwo = 0;
long fibN = 0;
for(int i = 2; i <= n; ++i)
{
fibN = fibNMinusOne + fibNMinusTwo;
fibNMinusTwo = fibNMinusOne;
fibNMinusOne = fibN;
}
return fibN;
}
算法对比:
n | 耗时(ms) | |
递归算法 | 优化算法 | |
0 | 0 | 0 |
5 | 0 | 0 |
10 | 0 | 0 |
15 | 0 | 0 |
20 | 0 | 0 |
25 | 0 | 0 |
30 | 16 | 0 |
35 | 93 | 0 |
40 | 1079 | 0 |
45 | 11969 | 0 |
50 | 132422 | 0 |
虽然上述算法对比在不同的运行环境下具有一定的差异性,但是我们可以从中发现:第一种基于递归的解法虽然直观可是时间效率很低,在实际软件开发中不会使用这种方法;第二种方法把递归的算法使用循环实现,极大地提高了时间效率,属于优秀的解法之一。