* Your assessment is very important for improving the workof artificial intelligence, which forms the content of this project
Download Recursion
Survey
Document related concepts
Transcript
Recursion Lakshmish Ramaswamy Basics of Recursion • A recursive method makes a call to itself directly or indirectly • Is this not endless circular logic? – Call is for a simpler instance • Several real-world applications are recursive – Dictionary lookup for definitions – Scanning files on a computer – Computer languages A Simple Example • Calculate sum of first N integers (S(N)) • We know S(1) = 1 • S(N) can be expressed as S(N) = S(N-1) + N – S(2) = 2 + S(1) – S(3) = S(2) + 3 – S(N) = N(N+1)/2 <---- Closed form • Closed form are often complex • Recursive expressions might be simpler Recursive Method for S(N) Points to Note • Function calls a clone of itself (note the difference in parameters) • Only one clone is active at any instance – Computer does all the book keeping for you • Base case – Instance that can be solved without recursion – S(1) is the base case • Recursive call should make progress towards base case Two Rules • Always have at least one base case solved without recursion • Any recursive call should make progress towards base case Second Example • Printing numbers in any base • Simpler case – Printing number in decimal form – No method that can print an integer – Method that can print a single character – Digits are treated as characters • print(2457) can be expressed as print(245) followed by printing 7 (via character printing method) Decimal Printing Method • Identify the base condition? • How is the progress done? Printing Number in any Base • Exception if base > 16 • Infinite loop if base is 1 – Notice identical call to the method (No progress) Robust Implementation How is Recursion Supported • Method invocation requires bookkeeping – Recursion is no different (may be a special case) • Activation records for implementing methods – Activation records hold important information like parameter values & local variables Stacks for Activation Records • Stack is a good data structure for reversing order – First-In-Last-Out paradigm • Why stacks? – Notice that methods return in reverse order of invocation • Activation record at top is that of currently active method – When a method is called, its activation record is pushed on the stack – Top record is popped when the method returns Stacks and Recursive Methods • Each method invocation results in an activation record • The base case is the last one to be pushed in and the first one to pop out Fibonacci Numbers • Definition – FN = FN-1 + FN-2 – F1 = 1 – F0 = 0 • Very interesting properties – Sum of first N Fibonacci numbers < FN+2 – Sum of squares of two consecutive Fibonacci numbers is also a Fibonacci number • Natural recursive implementation Simple but Inefficient Implementation What is the Problem? • Each call to fib(n-1) and fib(n-2) results in calling fib(n-3) • Keeps getting worse – Observe how many times F2, F1 and F0 are called • Lesson – Avoid duplicate work of solving same instance in separate duplicate calls Factorial Computation