Functions-Recall
1
2
Parameter passing & returnvoid main()
{
int x=10, y=5;
printf (“M1: x = %d, y = %d\n”, x, y);
interchange (x, y);
printf (“M2: x = %d, y = %d\n”, x, y);
}
void interchange (int x, int y)
{ int temp;
printf (“F1: x = %d, y = %d\n”, x, y);
temp= x; x = y; y = temp;
printf (“F2: x = %d, y = %d\n”, x, y);
}
Output
3
Parameter passing & returnvoid main()
{
int x=10, y=5;
printf (“M1: x = %d, y = %d\n”, x, y);
interchange (x, y);
printf (“M2: x = %d, y = %d\n”, x, y);
}
void interchange (int x, int y)
{ int temp;
printf (“F1: x = %d, y = %d\n”, x, y);
temp= x; x = y; y = temp;
printf (“F2: x = %d, y = %d\n”, x, y);
}
M1: x = 10, y = 5
F1: x = 10, y = 5
F2: x = 5, y = 10
M2: x = 10, y = 5
Output
4
Parameter passing & returnint x=11,y=6;
void interchange (int a, int b);
int main()
{
{ int x=6,y=11;
interchange (x,y);
}
printf("x=%d y=%d",x,y);
}
void interchange (int x, int y)
{ int temp;
temp=x;
x=y;
y=temp;
}
Homework
5
How are function calls implemented? The following applies in general, the implementation
details of function call The system maintains a stack in memory
Stack is a last-in first-out structure Two operations on stack, push and pop
Whenever there is a function call, the activation record gets pushed into the stack
Activation record consists of the return address in the calling program, the return value from the function, and the local variables inside the function
6
Pop activation record, whenever the function returns
Activation record looks like:
Return Addr
Return Value
Local Variables
7
void main(){ …….. x = gcd (a, b); ……..}
int gcd (int x, int y){ …….. …….. return (result);}
Return Addr
Return Value
Local Variables
Before call After call After return
ST
AC
K
Activation record
8
void main(){ …….. x = ncr (a, b); ……..}
int ncr (int n, int r){ x=fact(n); y=fact(r); z=fact(n-r); p=x/(y*z) return (p);}
LV1, RV1, RA1
Before call Call fact ncr returns
int fact (int n){ ……… return (result);}
3 times
LV1, RV1, RA1
fact returns
LV1, RV1, RA1
LV2, RV2, RA2
Call ncr
3 times
Push activation record
9
Return Addr
Return Value
a, b (Local x Variables)
main
Push activation record
10
Return Addr
Return Value
a, b (Local x Variables)
Return Addr
Return Value
n, r, p (Local Variables)
main
nCr
Parameter passing
11
void main(){ …….. x = ncr (a, b); ……..}
int ncr (int n, int r){ x=fact(n); y=fact(r); z=fact(n-r); p=x/(y*z) return (p);}
LV1, RV1, RA1
Before call Call fact ncr returns
int fact (int n){ ……… return (result);}
3 times
LV1, RV1, RA1
fact returns
LV1, RV1, RA1
LV2, RV2, RA2
Call ncr
3 times
Push activation record
12
Return Addr
Return Value
a, b (Local x Variables)
Return Addr
Return Value
n, r (Local Variables)
Return Addr
Return Value
n, result (Local Variables)
result
x
main
nCr
Parameter passing
Return
fact
Pop activation record
13
Return Addr
Return Value
Local Variables
Return Addr
Return Value
Local Variables
main
nCr
14
void main(){ …….. x = ncr (a, b); ……..}
int ncr (int n, int r){ x=fact(n); y=fact(r); z=fact(n-r); p=x/(y*z) return (p);}
LV1, RV1, RA1
Before call Call fact ncr returns
int fact (int n){ ……… return (result);}
3 times
LV1, RV1, RA1
fact returns
LV1, RV1, RA1
LV2, RV2, RA2
Call ncr
3 times
Push activation record
15
Return Addr
Return Value
Local Variables
Return Addr
Return Value
Local Variables
Return Addr
Return Value
Local Variables
result
y
main
fact
nCr
Pop activation record
16
Return Addr
Return Value
Local xVariables
Return Addr
Return Value p
Local Variables
main
Return
nCr
Pop activation record
17
Return Addr
Return Value
a, b (Local x Variables)
main
18
Recursion
19
Recursion
A process by which a function calls itself repeatedlyEither directly.
X calls XOr cyclically in a chain.
X calls Y, and Y calls X
Used for repetitive computations in which each action is stated in terms of a previous result fact(n) = n * fact (n-1)
20
Contd.
For a problem to be written in recursive form, two conditions are to be satisfied: It should be possible to express the problem
in recursive form Solution of the problem in terms of solution of the
same problem on smaller sized dataThe problem statement must include a
stopping condition
fact(n) = 1, if n = 0 = n * fact(n-1), if n > 0
Stopping condition
Recursive definition
21
Examples:
Factorial:fact(0) = 1fact(n) = n * fact(n-1), if n > 0
Fibonacci series (1,1,2,3,5,8,13,21,….)fib (0) = 1fib (1) = 1fib (n) = fib (n-1) + fib (n-2), if n > 1
22
Factorial
long int fact (int n)
{
if (n == 1)
return (1);
else
return (n * fact(n-1));
}
23
Factorial Execution
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
24
Factorial Execution fact(4)
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
25
Factorial Execution fact(4)
if (4 = = 1) return (1);else return (4 * fact(3));
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
26
Factorial Execution fact(4)
if (4 = = 1) return (1);else return (4 * fact(3));
if (3 = = 1) return (1);else return (3 * fact(2));
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
27
Factorial Execution fact(4)
if (4 = = 1) return (1);else return (4 * fact(3));
if (3 = = 1) return (1);else return (3 * fact(2));
if (2 = = 1) return (1);else return (2 * fact(1));
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
28
Factorial Execution
if (1 = = 1) return (1);
fact(4)
if (4 = = 1) return (1);else return (4 * fact(3));
if (3 = = 1) return (1);else return (3 * fact(2));
if (2 = = 1) return (1);else return (2 * fact(1));
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
29
Factorial Execution
if (1 = = 1) return (1);
fact(4)
if (4 = = 1) return (1);else return (4 * fact(3));
if (3 = = 1) return (1);else return (3 * fact(2));
if (2 = = 1) return (1);else return (2 * fact(1)); 1
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
30
Factorial Execution
if (1 = = 1) return (1);
fact(4)
if (4 = = 1) return (1);else return (4 * fact(3));
if (3 = = 1) return (1);else return (3 * fact(2));
if (2 = = 1) return (1);else return (2 * fact(1)); 1
2
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
31
Factorial Execution
if (1 = = 1) return (1);
fact(4)
if (4 = = 1) return (1);else return (4 * fact(3));
if (3 = = 1) return (1);else return (3 * fact(2));
if (2 = = 1) return (1);else return (2 * fact(1)); 1
2
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
32
Factorial Execution
if (1 = = 1) return (1);
fact(4)
if (4 = = 1) return (1);else return (4 * fact(3));
if (3 = = 1) return (1);else return (3 * fact(2));
if (2 = = 1) return (1);else return (2 * fact(1)); 1
2
6
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
33
Factorial Execution
if (1 = = 1) return (1);
fact(4)
if (4 = = 1) return (1);else return (4 * fact(3));
if (3 = = 1) return (1);else return (3 * fact(2));
if (2 = = 1) return (1);else return (2 * fact(1)); 1
2
6
24
long int fact (int n){ if (n = = 1) return (1); else return (n * fact(n-1));}
34
What happens for recursive calls? What we have seen ….
Activation record gets pushed into the stack when a function call is made
Activation record is popped off the stack when the function returns
In recursion, a function calls itselfSeveral function calls going on, with none of the
function calls returning back Activation records are pushed onto the stack continuously Large stack space required
35
Activation records keep popping off, when the termination condition of recursion is reached
We shall illustrate the process by an example of computing factorialActivation record looks like:
Return Addr
Return Value
Local Variables
36
Example:: main() calls fact(3)
int fact (n)
int n;
{
if (n = = 0)
return (1);
else
return (n * fact(n-1));
}
void main()
{
int n;
n = 3;
printf (“%d \n”, fact(n) );
}
37
TRACE OF THE STACK DURING EXECUTION
fact returns to main
RA .. main
-
n = 3
RA .. main
-
n = 3
RA .. fact
-
n = 2
RA .. main
-
n = 3
RA .. fact
-
n = 2
RA .. fact
-
n = 1
RA .. main
-
n = 3
RA .. fact
-
n = 2
RA .. fact
-
n = 1
RA .. fact
1
n = 0
RA .. main
-
n = 3
RA .. fact
-
n = 2
RA .. fact
1*1 = 1
n = 1
RA .. main
-
n = 3
RA .. fact
2*1 = 2
n = 2
RA .. main
3*2 = 6
n = 3
main calls fact
38
Look at the variable addresses (a slightly different program) !
void main()
{
int x,y;
scanf("%d",&x);
y = fact(x);
printf ("M: x= %d, y = %d\n", x,y);
}
int fact(int data)
{ int val = 1;
printf("F: data = %d, &data = %u \n
&val = %u\n", data, &data, &val);
if (data>1) val = data*fact(data-1);
return val;
}
4
F: data = 4, &data = 3221224528
&val = 3221224516
F: data = 3, &data = 3221224480
&val = 3221224468
F: data = 2, &data = 3221224432
&val = 3221224420
F: data = 1, &data = 3221224384
&val = 3221224372
M: x= 4, y = 24
Output
39
Fibonacci recurrence:
fib(n) = 1 if n = 0 or 1;
= fib(n – 2) + fib(n – 1)
otherwise;
int fib (int n) { if (n == 0 or n == 1)
return 1; [BASE] return fib(n-2) + fib(n-1) ; [Recursive] }
Fibonacci Numbers
40
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)
Fibonacci recurrence:
fib(n) = 1 if n = 0 or 1;
= fib(n – 2) + fib(n – 1)
otherwise;
int fib (int n) { if (n == 0 || n == 1)
return 1; return fib(n-2) + fib(n-1) ;}
41
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)
1 1 1 1 1
1
11
Fibonacci recurrence:
fib(n) = 1 if n = 0 or 1;
= fib(n – 2) + fib(n – 1)
otherwise;
int fib (int n) { if (n == 0 || n == 1)
return 1; return fib(n-2) + fib(n-1) ;}
fib.c
42
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)
1 1 1 1 1
1
11
1 2 2
211111
3
3
5
8
1 1
Fibonacci recurrence:
fib(n) = 1 if n = 0 or 1;
= fib(n – 2) + fib(n – 1)
otherwise;
int fib (int n) { if (n==0 || n==1)
return 1; return fib(n-2) + fib(n-1) ;}
43
Mergesort
44
Basic Idea Divide the array into two halves Sort the two sub-arrays Merge the two sorted sub-arrays into a single
sorted array Step 2 (sorting the sub-arrays) is done
recursively (divide in two, sort, merge) until the array has a single element (base condition of recursion)
45
Merging Two Sorted Arrays
3 4 7 8 9
2 5 7
2
3 4 7 8 9
2 5 7
2 3
3 4 7 8 9
2 5 7
2 3 4
3 4 7 8 9
2 5 7
Problem: Two sorted arrays A and B are given. We are required to
produce a final sorted array C which contains all elements of A and B.
46
2 3 4 5
3 4 7 8 9
2 5 7
2 3 4 5 7
3 4 7 8 9
2 5 7
2 3 4 5 7 7
3 4 7 8 9
2 5 7
2 3 4 5 7 7 8
3 4 7 8 9
2 5 7
47
Merge Code
2 3 4 5 7 7 8 9
3 4 7 8 9
2 5 7
void
merge (int A[], int B[], int C[], int m,int n)
{
int i=0,j=0,k=0;
while (i<m && j<n)
{
if (A[i] < B[j]) C[k++] = A[i++];
else C[k++] = B[j++];
}
while (i<m) C[k++] = A[i++];
while (j<n) C[k++] = B[j++];
}
48
Merge Sort: Sorting an array recursively
void mergesort (int A[], int n)
{
int i, j, B[max];
if (n <= 1) return;
i = n/2;
mergesort(A, i);
mergesort(A+i, n-i);
merge(A, A+i, B, i, n-i);
for (j=0; j<n; j++) A[j] = B[j];
free(B);
}