Functions : Recursion

1 / 29

# Functions : Recursion - PowerPoint PPT Presentation

Functions : Recursion. Lecture 12 4.2.2002. 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 ?. Recursion. int factorial (int n) { int temp; if (n<=1) return 1;

I am the owner, or an agent authorized to act on behalf of the owner, of the copyrighted work described.

## Functions : Recursion

Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.

- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -
Presentation Transcript

### Functions : Recursion

Lecture 12

4.2.2002

Sudeshna Sarkar, IIT Kharagpur

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 ?

Sudeshna Sarkar, IIT Kharagpur

Recursion

int factorial (int n)

{

int temp;

if (n<=1) return 1;

temp=factorial(n-1);

return n*temp;

}

int sum (int a, int b)

{

int temp;

if (a>b) return 0;

temp=sum(a+1,b);

return a+temp;

}

Sudeshna Sarkar, IIT Kharagpur

Recursion

1 4

sum(a,b) {

temp=sum(2,4);

return 1+temp;

}

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;

}

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;

}

Sudeshna Sarkar, IIT Kharagpur

Recursion

sum(1,4)

{

temp=sum(2,4);

return 1+temp;

}

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(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;

}

Sudeshna Sarkar, IIT Kharagpur

Recursion

sum(1,4)

{

temp=sum(2,4);

return 1+temp;

}

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(2,4)

{

temp=sum(3,4);

return 2+temp;

}

sum(3,4)

{

temp=4;

return 3+4;

}

Sudeshna Sarkar, IIT Kharagpur

Recursion

sum(1,4)

{

temp=sum(2,4);

return 1+temp;

}

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(2,4)

{

temp=7;

return 2+7;

}

Sudeshna Sarkar, IIT Kharagpur

Recursion

sum(1,4)

{

temp=9;

return 1+9;

}

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;

}

Sudeshna Sarkar, IIT Kharagpur

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

Sudeshna Sarkar, IIT Kharagpur

int sumSquares (int m, int n) {

if (m<n)

/* Recursion */

return sumSquares(m, n-1) + n*n;

else

/* Base Case */

return n*n ;

}

Example

int sumSquares (int m, int n) {

if (m<n)

/* Recursion */

return m*m + sumSquares(m+1, n);

else

/* Base Case */

return m*m ;

}

Sudeshna Sarkar, IIT Kharagpur

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

. . .

7

8

. . .

10

n

m

mid

mid+1

Sudeshna Sarkar, IIT Kharagpur

Call Tree

sumSquares(5,10)

sumSquares(5,10)

sumSquares(5,10)

sumSquares(8,10)

sumSquares(5,7)

sumSquares(10,10)

sumSquares(8,9)

sumSquares(7,7)

sumSquares(5,6)

sumSquares(9,9)

sumSquares(6,6)

sumSquares(8,8)

sumSquares(5,5)

Sudeshna Sarkar, IIT Kharagpur

Annotated Call Tree

355

sumSquares(5,10)

sumSquares(5,10)

245

110

sumSquares(5,10)

sumSquares(8,10)

sumSquares(5,7)

100

49

145

61

sumSquares(10,10)

sumSquares(8,9)

sumSquares(7,7)

sumSquares(5,6)

36

81

25

64

sumSquares(9,9)

sumSquares(6,6)

sumSquares(8,8)

sumSquares(5,5)

49

100

36

81

25

64

Sudeshna Sarkar, IIT Kharagpur

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

Sudeshna Sarkar, IIT Kharagpur

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.

Sudeshna Sarkar, IIT Kharagpur

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

Sudeshna Sarkar, IIT Kharagpur

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

Sudeshna Sarkar, IIT Kharagpur

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

}

Sudeshna Sarkar, IIT Kharagpur

Tower of Hanoi

A

B

C

Sudeshna Sarkar, IIT Kharagpur

Tower of Hanoi

A

B

C

Sudeshna Sarkar, IIT Kharagpur

Tower of Hanoi

A

B

C

Sudeshna Sarkar, IIT Kharagpur

Tower of Hanoi

A

B

C

Sudeshna Sarkar, IIT Kharagpur

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

}

Sudeshna Sarkar, IIT Kharagpur

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

Sudeshna Sarkar, IIT Kharagpur

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

}

Sudeshna Sarkar, IIT Kharagpur

Call Tree

5

fib (5)

2

3

fib (3)

fib (4)

1

2

1

1

fib (1)

fib (2)

fib (2)

fib (3)

1

1

1

0

1

1

0

fib (0)

fib (1)

fib (1)

fib (2)

fib (0)

fib (1)

1

1

1

1

0

0

0

fib (1)

fib (0)

1

0

Sudeshna Sarkar, IIT Kharagpur

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

Sudeshna Sarkar, IIT Kharagpur

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 ?

Sudeshna Sarkar, IIT Kharagpur

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 ?

Sudeshna Sarkar, IIT Kharagpur