functions : recursion
DESCRIPTION
Functions : Recursion. Lecture 11 4.2.2002. Announcements. Class Test – I on 7 th February, 6pm Section 1 & 2 at S-301 Section 5 & 6 at S-302. Call by value. Note : The parameter of a function can be a constant, variable, expression – anything that has a value. - PowerPoint PPT PresentationTRANSCRIPT
![Page 1: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/1.jpg)
31.1.2001 Sudeshna Sarkar, IIT Kharagpur1
Functions : Recursion
Lecture 114.2.2002
![Page 2: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/2.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/3.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/4.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/5.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/6.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/7.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/8.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/9.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/10.jpg)
31.1.2001 Sudeshna Sarkar, IIT Kharagpur10
Factorial Trace
n
t
n
t
n
t
n
t
n
t
![Page 11: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/11.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/12.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/13.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/14.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/15.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/16.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/17.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/18.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/19.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/20.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/21.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/22.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/23.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/24.jpg)
31.1.2001 Sudeshna Sarkar, IIT Kharagpur24
Tower of Hanoi
A B C
![Page 25: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/25.jpg)
31.1.2001 Sudeshna Sarkar, IIT Kharagpur25
Tower of Hanoi
A B C
![Page 26: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/26.jpg)
31.1.2001 Sudeshna Sarkar, IIT Kharagpur26
Tower of Hanoi
A B C
![Page 27: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/27.jpg)
31.1.2001 Sudeshna Sarkar, IIT Kharagpur27
Tower of Hanoi
A B C
![Page 28: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/28.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/29.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/30.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/31.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/32.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/33.jpg)
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: Functions : Recursion](https://reader036.vdocument.in/reader036/viewer/2022062518/56813ff2550346895dab093d/html5/thumbnails/34.jpg)
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 ?