裴波那契数列 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);
}
相关文章
相关标签/搜索