zoukankan      html  css  js  c++  java
  • Tail Recursion vs Traditional Recursion

    Traditional Recursion

    Perform recursive call first, and the do the calculation.

    public class FibRecusion {
        public long fib(long index) {
            if (index == 0 || index == 1) {
                return index;
            }
            
            return fib(index - 1) + fib(index - 2);
        }
    }    

    Tail Recursion

    Perform calculation first, then execute the recursive call, passing the results of the current step to the next recursive step.

    public class FibTailRecursion {
        public long fib(long index) {
            return fib(index, 1, 0);
        }
    
        private long fib(long n, long a, long b) {
              return n == 0 ? b : fib(n-1, a+b, a);
        }    
    
    }

    More Example

    Traditional Recursion

    public int getLinkedListLength(Node head) {
         if (head = null) {
              return 0;
         }
         return getLinkedListLength(head.next) + 1;
    }

    Tail Recursion

    public int getLinkedListLength(Node head, int accumulator) {
          if (head = null) {
              return accumulator;
         }
         return getLinkedListLength(head.next, accumulator + 1);
    }

    Comparision

    Traditional Recursion is very memory intensive and may lead to stack overflow. Tail Recursion is much faster and won't have stack overflow issue, as it will allow the optimision of the modern compiler and current stack frame won't be needed in the next step.

  • 相关阅读:
    JDK、J2EE、J2SE、J2ME的区别
    消息队列
    Unity3D 导入aar注意事项
    汇编小结
    构造函数语意学--笔记
    androidStudio 改包名
    新手用车
    北京临牌办理与续办
    h5+
    apache.http.MalformedChunkCodingException: Chunked stream ended unexpectedly
  • 原文地址:https://www.cnblogs.com/codingforum/p/8202326.html
Copyright © 2011-2022 走看看