1 n = 1 or 2
fn = f(n-1) + f(n-2) n > 2
請用不用遞迴的方法,也不用陣列,寫一個函數,它接收n的值,傳回fn。
解:
我們只要記錄下fn-1和fn-2,就可以算出fn。
相對來說只要從1往上記錄,每次記錄下前2個,
最後就可以達到fn了!
不用遞迴的好處是節省重複運算,
當然也可以用陣列來記錄遞迴,
這個方法在之前[Algorithm] 以空間換取時間(以Fibonacci為例)裡有提過。
這裡不使用陣列的好處是節省空間,但相對而言,
最後就不會記錄下n-3以前的數據(會全部被蓋掉)。
Code:
unsigned long fibonacci(int n)
{
unsigned long tmp, fn_2, fn_1;
int i;
if( n <= 2 )
return 1;
else
for(fn_2=fn_1=1, i=3; i<=n; i++)
{
tmp = fn_1 + fn_2;
fn_2 = fn_1;
fn_1 = tmp;
}
return tmp;
}
沒有留言:
張貼留言