- By
**neron** - Follow User

- 71 Views
- Uploaded on

Download Presentation
## Functions : Recursion

**An Image/Link below is provided (as is) to download presentation**

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

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 ;

}

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

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

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

Download Presentation

Connecting to Server..