Presentation is loading. Please wait.

Presentation is loading. Please wait.

31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 12 4.2.2002.

Similar presentations


Presentation on theme: "31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 12 4.2.2002."— Presentation transcript:

1 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 12 4.2.2002

2 31.1.2001Sudeshna Sarkar, IIT Kharagpur 2 Recursion a + (a+1) + (a+2) +... + b = a + ((a+1) + (a+2) +... + b) sum(a,b) = a + sum(a+1,b) Base case ? factorial (n) = n*factorial(n-1) Base case ?

3 31.1.2001Sudeshna Sarkar, IIT Kharagpur 3 Recursion int sum (int a, int b) { int temp; if (a>b) return 0; temp=sum(a+1,b); return a+temp; } int factorial (int n) { int temp; if (n<=1) return 1; temp=factorial(n-1); return n*temp; }

4 31.1.2001Sudeshna Sarkar, IIT Kharagpur 4 Recursion main () {... x = sum(1,4);... } int sum (int a, int b) { int temp; if (a>b) return 0; temp=sum(a+1,b); return a+temp; } 1 4 sum(a,b) { temp=sum(2,4); return 1+temp; } sum(2,4) { temp=sum(3,4); return 2+temp; } sum(3,4) { temp=sum(4,4); return 3+temp; } sum(4,4) { temp=sum(5,4); return 4+temp; } sum(5,4) { return 0; }

5 31.1.2001Sudeshna Sarkar, IIT Kharagpur 5 Recursion main () {... x = sum(1,5);... } int sum (int a, int b) { int temp; if (a>b) return 0; temp=sum(a+1,b); return a+temp; } sum(1,4) { temp=sum(2,4); return 1+temp; } sum(2,4) { temp=sum(3,4); return 2+temp; } sum(3,4) { temp=sum(4,4); return 3+temp; } sum(4,4) { temp=0; return 4; }

6 31.1.2001Sudeshna Sarkar, IIT Kharagpur 6 Recursion main () {... x = sum(1,5);... } int sum (int a, int b) { int temp; if (a>b) return 0; temp=sum(a+1,b); return a+temp; } sum(1,4) { temp=sum(2,4); return 1+temp; } sum(2,4) { temp=sum(3,4); return 2+temp; } sum(3,4) { temp=4; return 3+4; }

7 31.1.2001Sudeshna Sarkar, IIT Kharagpur 7 Recursion main () {... x = sum(1,5);... } int sum (int a, int b) { int temp; if (a<=b) return 0; temp=sum(a+1,b); return a+temp; } sum(1,4) { temp=sum(2,4); return 1+temp; } sum(2,4) { temp=7; return 2+7; }

8 31.1.2001Sudeshna Sarkar, IIT Kharagpur 8 Recursion main () {... x = sum(1,5);... } int sum (int a, int b) { int temp; if (a<=b) return 0; temp=sum(a+1,b); return a+temp; } sum(1,4) { temp=9; return 1+9; }

9 31.1.2001Sudeshna Sarkar, IIT Kharagpur 9 void foo () { char ch; scanf (“%c”, &ch); if (ch==‘\n’) return; foo (); printf (“%c”, &ch); } What will the program output on the following input ? PDS \n

10 31.1.2001Sudeshna Sarkar, IIT Kharagpur 10 Example int sumSquares (int m, int n) { if (m<n) /* Recursion */ return sumSquares(m, n-1) + n*n; else /* Base Case */ return n*n ; } int sumSquares (int m, int n) { if (m<n) /* Recursion */ return m*m + sumSquares(m+1, n); else /* Base Case */ return m*m ; }

11 31.1.2001Sudeshna Sarkar, IIT Kharagpur 11 Example int sumSquares (int m, int n) { int middle ; if (m==n) return m*m; else { middle = (m+n)/2; return sumSquares(m,middle) + sumSquares(middle+ 1,n) ; } 5...1087... m midmid+1 n

12 31.1.2001Sudeshna Sarkar, IIT Kharagpur 12 Call Tree sumSquares(5,10) sumSquares(5,7) sumSquares(5,10)sumSquares(8,10) sumSquares(5,6) sumSquares(7,7) sumSquares(8,9) sumSquares(10,10) sumSquares(5,5) sumSquares(6,6)sumSquares(8,8) sumSquares(9,9)

13 31.1.2001Sudeshna Sarkar, IIT Kharagpur 13 Annotated Call Tree sumSquares(5,10) sumSquares(5,7) sumSquares(5,10)sumSquares(8,10) sumSquares(5,6) sumSquares(7,7) sumSquares(8,9) sumSquares(10,10) sumSquares(5,5) sumSquares(6,6)sumSquares(8,8) sumSquares(9,9) 355 110 61 49 245 145 100 25 36 64 81 25 36 49 64 81 100

14 31.1.2001Sudeshna Sarkar, IIT Kharagpur 14 Trace sumSq(5,10) = (sumSq(5,7) + sumSq(8,10)) = (sumSq(5,6) + (sumSq(7,7)) + (sumSq(8,9) + sumSq(10,10)) = ((sumSq(5,5) + sumSq(6,6)) + sumSq(7,7)) + ((sumSq(8,8) + sumSq(9,9)) + sumSq(10,10)) = ((25 + 36) + 49) + ((64 + 81) + 100) = (61 + 49) + (145 + 100) = (110 + 245) = 355

15 31.1.2001Sudeshna Sarkar, IIT Kharagpur 15 Recursion : The general idea Recursive programs are programs that call themselves to compute the solution to a subproblem having these properties : 1. the subproblem is smaller than the overall problem or, simpler in the sense that it is closer to the final solution 2. the subproblem can be solved directly (as a base case) or recursively by making a recursive call. 3. the subproblem’s solution can be combined with solutions to other subproblems to obtain the solution to the overall problem.

16 31.1.2001Sudeshna Sarkar, IIT Kharagpur 16 Think recursively Break a big problem into smaller subproblems of the same kind, that can be combined back into the overall solution : Divide and Conquer

17 31.1.2001Sudeshna Sarkar, IIT Kharagpur 17 Exercise 1. Write a recursive function that computes x n, called power (x, n), where x is a floating point number and n is a non- negative integer. 2. Write an improved recursive version of power(x,n) that works by breaking n down into halves, squaring power(x, n/2), and multiplying by x again if n is odd. 3. To calculate the square root of x (a +ve real) by Newton’s method, we start with an initial approximation a=x/2. If |x- a  a|  epsilon, we stop with the result a. Otherwise a is replaced with the next approximation, (a+x/a)/2. Write a recursive method, sqrt(x) to compute square root of x by Newton’s method.

18 31.1.2001Sudeshna Sarkar, IIT Kharagpur 18 Common Pitfalls Infinite Regress : a base case is never encountered a base case that never gets called : fact (0) running out of resources : each time a function is called, some space is allocated to store the activation record. With too many nested calls, there may be a problem of space. int fact (int n) { if (n==1) return 1; return n*fact(n-1); }

19 31.1.2001Sudeshna Sarkar, IIT Kharagpur 19 Tower of Hanoi ABC

20 31.1.2001Sudeshna Sarkar, IIT Kharagpur 20 Tower of Hanoi ABC

21 31.1.2001Sudeshna Sarkar, IIT Kharagpur 21 Tower of Hanoi ABC

22 31.1.2001Sudeshna Sarkar, IIT Kharagpur 22 Tower of Hanoi ABC

23 31.1.2001Sudeshna Sarkar, IIT Kharagpur 23 void towers (int n, char from, char to, char aux) { if (n==1) { printf (“Disk 1 : %c -> &c \n”, from, to) ; return ; } towers (n-1, from, aux, to) ; printf (“Disk %d : %c  %c\n”, n, from, to) ; towers (n-1, aux, to, from) ; }

24 31.1.2001Sudeshna Sarkar, IIT Kharagpur 24 Disk 1 : A -> C Disk 2 : A -> B Disk 1 : C -> B Disk 3 : A -> C Disk 1 : B -> A Disk 2 : B -> C Disk 1 : A -> C Disk 4 : A -> B Disk 1 : C -> B Disk 2 : C -> A Disk 1 : B -> A Disk 3 : C -> B Disk 1 : A -> C Disk 2 : A -> B Disk 1 : C -> B towers (4, ‘A’, ‘B’, ‘C’) ;

25 31.1.2001Sudeshna Sarkar, IIT Kharagpur 25 Recursion may be expensive ! Fibonacci Sequence: fib (n) = n if n is 0 or 1 fib (n) = fib (n-2) + fib(n-1) if n>= 2. int fib (int n){ if (n==0 or n==1) return 1; return fib(n-2) + fib(n-1) ; }

26 31.1.2001Sudeshna Sarkar, IIT Kharagpur 26 Call Tree fib (5) fib (3)fib (4) fib (1) fib (2)fib (1)fib (2) fib (0) fib (3) fib (1) fib (2) fib (0) fib (1) 0 10 1 1 1 1 0 1 1 1 1 1101 0 2 2 3 5 0 1

27 31.1.2001Sudeshna Sarkar, IIT Kharagpur 27 Iterative fibonacci computation int fib (int n){ if (n <= 1) return n; lofib = 0 ; hifib = 1 ; for (i=2; i<=n; i++) { x = lofib ; lofib = hifib ; hifib = x + lofib; } return hifib ; } i = 2 3 4 5 6 7 x = 0 1 1 2 3 5 lofib= 0 1 1 2 3 5 8 hifib= 1 1 2 3 5 8 13

28 31.1.2001Sudeshna Sarkar, IIT Kharagpur 28 Merge Sort To sort an array of N elements, 1. Divide the array into two halves. Sort each half. 2. Combine the two sorted subarrays into a single sorted array Base Case ?

29 31.1.2001Sudeshna Sarkar, IIT Kharagpur 29 Binary Search revisited To search if key occurs in an array A (size N) sorted in ascending order: mid = N/2; if (key == N/2) item has been found if (key < N/2) search for the key in A[0..mid-1] if (key > N/2) search for key in A[mid+1..N] Base Case ?


Download ppt "31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 12 4.2.2002."

Similar presentations


Ads by Google