[数据结构与算法] Fibonacci数

通过二分递归计算Fibonacci数。该算法需要运行O(2 n )时间才能计算出第n个Fibonacci数。这一指数复杂度的算法,在实际环境中毫无价值。

__int64 fib ( int n ) { //计算Fibonacci数列的第n项(二分递归版):O(2^n)
   return ( 2 > n ) ?
          ( __int64 ) n //若到达递归基,直接取值
          : fib ( n - 1 ) + fib ( n - 2 ); //否则,递归计算前两项,其和即为正解
}

通过线性递归计算Fibonacci数。累计耗时不超过O(n)。遗憾的是,该算法共需使用O(n)规模的附加空间。

__int64 fib ( int n, __int64& prev ) { //计算Fibonacci数列第n项(线性递归版):入口形式fib(n, prev)
   if ( 0 == n ) //若到达递归基,则
      { prev = 1; return 0; } //直接取值:fib(-1) = 1, fib(0) = 0
   else { //否则
      __int64 prevPrev; prev = fib ( n - 1, prevPrev ); //递归计算前两项
      return prevPrev + prev; //其和即为正解
   }
} //用辅助变量记录前一项,返回数列的当前项,O(n)

基于动态规划策略计算Fibonacci数。这里仅使用了两个中间变量f和g,记录当前的一对相邻Fibonacci数。整个算法仅需线性步的迭代,时间复杂度为O(n)。更重要的是,该版本仅需常数规模的附加空间,空间效率也有了极大提高。

__int64 fibI ( int n ) { //计算Fibonacci数列的第n项(迭代版):O(n)
   __int64 f = 1, g = 0; //初始化:fib(-1)、fib(0)
   while ( 0 < n-- ) { g += f; f = g - f; } //依据原始定义,通过n次加法和减法计算fib(n)
   return g; //返回
}
发布了82 篇原创文章 · 获赞 4 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/x1131230123/article/details/103881199