//使用迭代的方式
int fun1(int n)
{
if (n <= 2)
return 1;
int a, b, c;
a = 1;
b = 1;
for (int i=3; i<=n; i++)
{
c = a + b;
a = b;
b = c;
}
return c;
}
//使用打表的方式
int f[100];
int fun2(int n)
{
f[1] = f[2] = 1;
for (int i=3; i<=n; i++)
f[i] = f[i-1] + f[i-2];
return f[n];
}
//使用遞歸 f(n) = f(n-1) + f(n-2)
int fun3(int n)
{
if (n <= 1)
return n;
return fun1(n-1) + fun1(n-2);
}
//fun3()在遞歸調用過程中產生大量冗餘 很多f(n)會計算多次 改進如下
int additiveSequence(int n, int t0, int t1)
{
if (n == 0)
return t0;
if (n == 1)
return t1;
return additiveSequence(n-1, t1, t0 + t1);
}
int fun4(int n)
{
return additiveSequence(n, 0, 1);
}
//將結果緩存,避免重複的遞歸
int f[30];
int fun5(int n)
{
if (n == 0)
return f[0] = 0;
else if (n == 1)
return f[1] = 1;
else
{
f[n] = fun(n-1) + fun(n-2);
return f[n];
}
}
參考:《程序設計抽象思想》
斐波那契數列
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.