斐波那契数字
动态规划的典型应用,求第n个斐波那契数字,下面给大家介绍几种方法。
- 方法1–递归
用递归求解该问题的时间复杂度是指数型的, T(n) = T(n-1) + T(n-2) 代码如下
class fibonacci
{
public int fib(int n)
{
if (n <= 1)
return n;
return fib(n-1) + fib(n-2);
}
}
-
方法2–动态规划
如果我们仔细观察方法一就会发现,方法一做了好多重复的工作使得它的复杂度显著的提升了,如下所示fib(5) / \ fib(4) fib(3) / \ / \ fib(3) fib(2) fib(2) fib(1) / \ / \ / \ fib(2) fib(1) fib(1) fib(0) fib(1) fib(0) / \ fib(1) fib(0)
我们可以通过记录下当前的斐波那契数字,来避免重复的计算。这样时间复杂度就变成了O(1),(如果我们考虑函数调用堆栈的大小为O(n))。代码如下:
class fibonacci
{
public int fib(int n)
{
/*用一个数组来存储斐波那契数字. */
int f[] = new int[n+2];
int i;
/* 先储存第1和第2个斐波那契数字*/
f[0] = 0;
f[1] = 1;
for (i = 2; i <= n; i++)
{
f[i] = f[i-1] + f[i-2];
}
return f[n];
}
}
- 方法三
方法三是对方法二的空间复杂度进行优化。我们可以通过存储前两个数字来优化方法2中使用的空间,因为我们只需要获取序列中的下一个斐波那契数即可。代码如下:
class fibonacci
{
public int fib(int n)
{
/*用a和b存储要求的斐波那契的前两个数,然后更新a和b*/
int a = 0, b = 1, c;
if (n == 0)
return a;
for (int i = 2; i <= n; i++)
{