裴波那契数列 JavaScript 尾递归实现

一般递归实现 :

  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. }

或者:

function fibonacci(n){

  if(n<2)

  return n;

  else

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

}

 

尾递归实现:

  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. }

跟这样的迭代方法是完全等价的:

  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);
}

 

posted on 2013-07-01 13:58  Joey_zy0210  阅读(491)  评论(0编辑  收藏  举报

导航