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.

原文地址:https://www.cnblogs.com/codingforum/p/8202326.html