裴波那契數列 JavaScript 尾遞歸實現

通常遞歸實現 :ide

  1. //經典遞歸
  2. function fibonacci(n) { 
  3.     return (function(n) { 
  4.         if (n == 1 || n == 2) 
  5.             return 1;
  6.         return arguments.callee(n - 1) + arguments.callee(n - 2);
  7.     })(n);
  8. }

或者:spa

function fibonacci(n){code

  if(n<2)遞歸

  return n;ci

  elseit

    return fibonacci(n-1)+fibonacci(n-2);io

}function

 

尾遞歸實現:class

  1. //尾遞歸
  2. function fibonacci(n){ 
  3.     return (function(n1, n2, i){ 
  4.         return (i < n) ? arguments.callee(n2, n1+n2, i+1) : n1;
  5.     })(1,1,1);
  6. }

跟這樣的迭代方法是徹底等價的:import

  1. //等價的循環
  2. function fibonacci(n){ 
  3.     var n1 = n2 = s = i = 1;
  4.     for(; i<n; i++){
  5.         s = n1 + n2;
  6.         n1 = n2;
  7.         n2 = s;
  8.     }
  9.     return n1;
  10. }

C# 版:

傳統的遞歸方式以下:

public static int FibonacciRecursively(int n)
{
    if (n < 2) return n;
    return FibonacciRecursively(n - 1) + FibonacciRecursively(n - 2);
}

 

而改形成尾遞歸,咱們則須要提供兩個累加器:

 

public static int FibonacciTailRecursively(int n, int acc1, int acc2)
{
    if (n == 0) return acc1;
    return FibonacciTailRecursively(n - 1, acc2, acc1 + acc2);
}
相關文章
相關標籤/搜索