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; }
沒有留言:
張貼留言