5 Recursion&1DArrays
5 Recursion&1DArrays
arrays
Function
Definition
Function call
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
• This function call mechanism is depicted in the following figure.
• Note that the red arrow shows the function call and return.
• 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
Local
Activation Variables
record Return Value
STACK
Return Addr
• Factorial:
fact(0) = 1
fact(n) = n * fact(n-1), if n > 0
if (4 = = 0) return (1);
else return (4 * fact(3));
if (4 = = 0) return (1);
else return (4 * fact(3));
if (3 = = 0) return (1);
else return (3 * fact(2));
if (4 = = 0) return (1);
else return (4 * fact(3));
if (3 = = 0) return (1);
else return (3 * fact(2));
if (2 = = 0) return (1);
else return (2 * fact(1));
long int fact (int n)
{
if (n = = 0) return (1);
else return (n * fact(n-1));
}
Factorial Execution
fact(4)
if (4 = = 0) return (1);
else return (4 * fact(3));
if (3 = = 0) return (1);
else return (3 * fact(2));
if (2 = = 0) return (1);
else return (2 * fact(1));
long int fact (int n)
{
if (1 = = 0) return (1);
if (n = = 0) return (1);
else return (n * fact(n-1)); else return (1 * fact(0));
}
if (0 = = 0) return (1);
Factorial Execution
fact(4)
if (4 = = 0) return (1);
else return (4 * fact(3));
if (3 = = 0) return (1);
else return (3 * fact(2));
if (2 = = 0) return (1);
else return (2 * fact(1)); 1
long int fact (int n)
{
if (1 = = 0) return (1);
if (n = = 0) return (1);
else return (n * fact(n-1)); else return (1 * fact(0)); 1
}
if (0 = = 0) return (1);
Factorial Execution
fact(4)
if (4 = = 0) return (1);
else return (4 * fact(3));
if (3 = = 0) return (1);
else return (3 * fact(2)); 2
if (2 = = 0) return (1);
else return (2 * fact(1)); 1
long int fact (int n)
{ if (1 = = 0) return (1);
if (n = = 1) return (1);
else return (n * fact(n-1)); else return (1 * fact(0)); 1
} if (0 = = 0) return (1);
Factorial Execution
fact(4)
if (4 = = 0) return (1);
else return (4 * fact(3));
if (3 = = 0) return (1);
else return (3 * fact(2)); 2
if (2 = = 0) return (1);
else return (2 * fact(1)); 1
long int fact (int n)
{
if (1 = = 0) return (1);
if (n = = 0) return (1);
else return (n * fact(n-1)); else return (1 * fact(0)); 1
}
if (0 = = 0) return (1);
Factorial Execution
fact(4)
if (4 = = 0) return (1);
else return (4 * fact(3)); 6
if (3 = = 0) return (1);
else return (3 * fact(2)); 2
if (2 = = 0) return (1);
else return (2 * fact(1)); 1
long int fact (int n)
{
if (1 = = 0) return (1);
if (n = = 0) return (1);
else return (n * fact(n-1)); else return (1 * fact(0)); 1
}
if (0 = = 0) return (1);
Factorial Execution
fact(4) 24
if (4 = = 0) return (1);
else return (4 * fact(3)); 6
if (3 = = 0) return (1);
else return (3 * fact(2)); 2
if (2 = = 0) return (1);
else return (2 * fact(1)); 1
long int fact (int n)
{
if (1 = = 0) return (1);
if (n = = 0) return (1);
else return (n * fact(n-1)); else return (1 * fact(0)); 1
}
if (0 = = 0) return (1);
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 itself
• Several function calls going on, with none of the function calls returning
back
• Activation records are pushed onto the stack continuously
• Large stack space required
• Activation records keep popping off when the termination condition of
recursion is reached
Local
Variables
Return Value
Return Addr
Example:: main() calls fact(3)
int main()
{
int fact (n)
int n;
int n;
n = 3;
{
printf (“%d \n”, fact(n) );
if (n = = 0)
}
return (1);
else
return (n * fact(n-1));
}
TRACE OF THE STACK DURING EXECUTION
n=0
1
RA .. fact
main
n=1 n=1 n=1 fact
- - 1*1 = 1 returns
calls RA .. fact RA .. fact RA .. fact
fact to main
n=2 n=2 n=2 n=2 n=2
- - - - 2*1 = 2
RA .. fact RA .. fact RA .. fact RA .. fact RA .. fact
n=3 n=3 n=3 n=3 n=3 n=3 n=3
- - - - - - 3*2 = 6
RA .. main RA .. main RA .. main RA .. main RA .. main RA .. main RA .. main
Fibonacci Numbers
Fibonacci recurrence:
fib(n) = 0 if n = 0
=1 if n = 1
= fib(n – 2) + fib(n – 1)
otherwise;
fib (0) fib (1) fib (0) fib (1) fib (1) fib (2)
fib (0) fib (1) fib (0) fib (1) fib (1) fib (2)
1 0 1 1
0
fib (0) fib (1)
0 1
int fib (int n) {
if (n == 0 )
return 0;
if (n == 1)
return 1;
8 return fib(n-2) + fib(n-1) ;
fib (5) }
3 5
fib (3) fib (4)
1 2 2 3
fib (1) fib (2) fib (2) fib (3)
1 2
1 1 1 1 1
fib (0) fib (1) fib (0) fib (1) fib (1) fib (2)
1 0 1 1 1
0 1
fib (0) fib (1)
0 1
Function call sequence
Reversing number using recursion
#include<stdio.h>
int reverse(int num, int rev)
{
if(num==0)
int reverse(int , int );
return rev;
else
return reverse(num/10, rev*10 + num%10);
int main() }
{
int number, result;
printf("Enter number: ");
scanf("%d", &number);
//2nd argument must be 0 while calling
result = reverse(number, 0);
printf("Reverse of %d is %d.", number,
result);
return 0;
}
Arrays -
Introduction
1
Array
s
• The locations of the array are accessed using the array name
combined with an index. For example, an array a[] that can
store six integers can be visualized as follows.
int c[6];
char
ch[3];
• Following
examples
show the
initializatio
n of 1-D
arrays.
int
Points to
note
int main(){
int ar[10];
/*A for loop to populate the array*/
for(int i=0;i<10;i++) scanf("%d", &ar[i]);
return 0;
}
Problem
1
printf("Average = %f",
sum/(float)10);
return 0;
Problem
2
7 max=ar[0];
8 for(int i=1;i<10;i++)
9 if (ar[i]>max) max=ar[i];
10
10 for(int i=1;i<n;i++)
11 if (ar[i]==key) {flag=1; break;}
12 if (flag)
13 printf("The element found");
14 else
15 printf("The element NOT found");
16 return 0;
17 }