31.1.2001sudeshna sarkar, iit kharagpur 1 functions : recursion lecture 11 4.2.2002

34
31.1.2001 Sudeshna Sarkar, IIT Khara gpur 1 Functions : Recursion Lecture 11 4.2.2002

Upload: austen-hill

Post on 13-Jan-2016

217 views

Category:

Documents


0 download

TRANSCRIPT

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

31.1.2001 Sudeshna Sarkar, IIT Kharagpur1

Functions : Recursion

Lecture 114.2.2002

Page 2: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur2

Announcements

Class Test – I on 7th February, 6pm Section 1 & 2 at S-301 Section 5 & 6 at S-302

Page 3: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur3

Call by value

void printDouble (int x) { printf (“Double of %d “, x);

x *= 2; printf (“is %d\n”, x) ;

}void main () {

int num=15; printDouble (num); printf (“ num = %d\n”, num);

}

Note : The parameter of a function can be a constant, variable, expression – anything that has a value.

Only the value ispassed to the function.

Page 4: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur4

Recursion

Def : A function is recursive if it calls itself. int rfun (int x) {

. . .

rfun (2*a) ;

. . .

}

Questions : How does recursion work ? Why do I write a recursive function ?

Page 5: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur5

Thinking Recursively

Learning Objectives To learn to think recursively To learn how strategies for recursion involve both

base cases and recursion cases To learn how to search for different ways of

decomposing a problem into subproblems. To understand how to use call trees and traces to

reason about how recursive programs work

Page 6: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur6

Program vs Process

Program = a set of instructions akin to the blueprint of an information factory

Process = activity performed by computer when obeying the instructions akin to operation of a working factory

can create multiple factories as needed from the same blueprint

need to allocate different local variables

Page 7: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur7

Factorial via Recursion

/* 0! = 1! = 1, for n>1, n! = n* (n-1)! */

int factorial (int n) {

int t;if (n <=1) t=1;

else t = n * factorial (n-1) ;

return t;

}

Page 8: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur8

Review : Function Basics

Tracing recursive functions is apparent if you remember the basics about functions : Formal parameters and variables declared in a

function is local to it. Allocated (created) on function entry De-allocated (destroyed) on function return

Formal parameters initialized by copying value of actual parameter.

Page 9: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur9

Factorial

factorial (4) =

4 * factorial (3) =

4 * 3 * factorial (2) =

4 * 3 * 2 * factorial (1) =

4 * 3 * 2 * 1 = 24

Page 10: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur10

Factorial Trace

n

t

n

t

n

t

n

t

n

t

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

31.1.2001 Sudeshna Sarkar, IIT Kharagpur11

int findmax (int n)

{

int i, num, max;

scanf ("%d", &num) ;

max = num;

for (i=1; i<n; i++) {

scanf ("%d", &num) ;

if (num > max)

max = num;

}

return max;

}

int findmax (int n, int max)

{

int num;

if (n==0) return max;

scanf ("%d", &num) ;

if (num > max) max = num;

max = findmax (n-1, max) ;

return max;

}

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

31.1.2001 Sudeshna Sarkar, IIT Kharagpur12

Iteration vs. Recursion

Any iterative algorithm can be re-worked to use recursion, and vice-versa.

Some algorithms are more naturally written with recursion. But naive applications of recursion can be

inefficient.

Page 13: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur13

When to use Recursion ?

Problem has 1 or more simple cases. These have a straightforward non-recursive

solution. Other cases can be re-defined in terms of

problems that are closer to simple cases By applying this redefn process repeatedly one

gets to one of the simple cases.

Page 14: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur14

Example

int sumSquares (int m, int n) {

int i, sum;

sum = 0;

for (i=m; i<=n; i++)

sum += i*i;

return sum;

}

Page 15: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur15

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 ;

}

Page 16: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur16

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 . . .

mmidmid+1

n

Page 17: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur17

Call Tree

sumSquares(5,10)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)

Page 18: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur18

Annotated Call Tree

sumSquares(5,10)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

Page 19: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur19

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

Page 20: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur20

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.

Page 21: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur21

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

Page 22: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur22

Exercise

1. Write a recursive function that computes xn , 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-aa| 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.

Page 23: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur23

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);}

Page 24: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur24

Tower of Hanoi

A B C

Page 25: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur25

Tower of Hanoi

A B C

Page 26: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur26

Tower of Hanoi

A B C

Page 27: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur27

Tower of Hanoi

A B C

Page 28: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur28

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) ;}

Page 29: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur29

Disk 1 : A -> CDisk 2 : A -> BDisk 1 : C -> BDisk 3 : A -> CDisk 1 : B -> ADisk 2 : B -> CDisk 1 : A -> CDisk 4 : A -> BDisk 1 : C -> BDisk 2 : C -> ADisk 1 : B -> ADisk 3 : C -> BDisk 1 : A -> CDisk 2 : A -> BDisk 1 : C -> B

towers (4, ‘A’, ‘B’, ‘C’) ;

Page 30: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur30

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) ;}

Page 31: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur31

Call Tree

fib (5)

fib (3) fib (4)

fib (1)

fib (2)fib (1) fib (2)

fib (0)

fib (3)

fib (1)

fib (1) fib (2)

fib (0)

fib (0) fib (1)

0 1 0 1 1

1

10

1 1 1

111010

2

2

3

5

0 1

Page 32: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur32

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 7x = 0 1 1 2 3 5lofib= 0 1 1 2 3 5 8hifib= 1 1 2 3 5 8 13

Page 33: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur33

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 ?

Page 34: 31.1.2001Sudeshna Sarkar, IIT Kharagpur 1 Functions : Recursion Lecture 11 4.2.2002

31.1.2001 Sudeshna Sarkar, IIT Kharagpur34

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 ?