• 裴波那契数列 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);
    }
    
  • 相关阅读:
    HDU 1423
    POJ 3264
    POJ 3177
    CodeForces 81A
    SPOJ RATING
    ZOJ 2588
    POJ 1523
    POJ 3667
    递归
    数据结构
  • 原文地址:https://www.cnblogs.com/joey0210/p/3164786.html
Copyright © 2020-2023  润新知