CS 211 Object Oriented Programming Tail Recursion Tail
CS 211 Object Oriented Programming Tail Recursion
Tail Recursion ● ● A method is tail recursive if the last action of the recursive method is the recursive call Recursion puts frame on the stack – the additional overhead required by non-tail recursion could be costly for large inputs
Non Tail Recursion //Factorial public static int recurcive. Fact(int n) { if(n == 0) { return 1; } else { return n*recurcive. Fact(n-1); } }
Simulation recurcive. Fact(4) recurcive. Fact(3) recurcive. Fact(2) recurcive. Fact(1) = 4*recurcive. Fact(3) = 3*recurcive. Fact(2) = 2*recurcive. Fact(1) = 1*recurcive. Fact(0) =1*1 =1 recurcive. Fact(2) = 2*recurcive. Fact(1) = 2*1 = 2 recurcive. Fact(3) = 3*recurcive. Fact(2) = 3*2 = 6 recurcive. Fact(4) = 4*recurcive. Fact(3) = 4*6 = 24
Recursion in Stack ● Factorial :
Tail Recursion – Factorial public static int tailrecurcive. Fact(int { return factorial(n, 1); } private static int factorial(int n, int a { if(n==0) return accum; else{ return factorial(n-1, n*accum); } }
Simulation tailrecurcive. Fact(4) = factorial(4, 1) = factorial(3, 4*1) = factorial(2, 4*1*3) = factorial(1, 4*1*3*2) = factorial(0, 4*1*3*2 = 24 factorial(2, 4*1*3) = 24 factorial(3, 4*1) = 24 factorial(4, 1) = 24 tailrecurcive. Fact(4) = 24;
Tail Recursion - Fibonacci public int fibonacci(int n) { if(n == 0) return 0; else if(n == 1) return 1; else return fibonacci(n - 1) + fibonacci(n - 2); }
Simulation //Fibonacci fibonacci(5) = fibonacci(4) + fibonacci(3) = fibonacci(2) + fibonacci(4) = fibonacci(3) + fibonacci(2) = fibonacci(1) + fibonacci(
Non-Tail Recursion public String rev(String w) { if(w == null || w. equals("")) return w; else return rev(w. substring(1, w. len + w. substring(0, 1); }
Tail Recursion //”hook” public String rev(String w) { return tail. Rev(w, ""); } //tail recursion public String t. Rev(String w, String res) if(w==null || w. equals("")) return res; else return t. Rev(w. substring(1, w. len w. char
Questions?
- Slides: 12