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.