2013年2月18日 星期一

[C Programming] Fibonacci數非遞迴解

Fibonacci數列f1,f2,...,fn的定義是這樣的:
        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;
}

沒有留言:

張貼留言