2. Functions – reminder
A function can call other functions.
Return causes the execution of the function to
terminate and returns a value to the calling
function.
The type of the value returned must be the same
as the return-type defined for the function.
return-type name(argType1 arg1, argType2 arg2, …) {
function body;
return value;
}
3. A recursive definition
C functions can also call themselves!
However, usually not with the same parameters
(why?)
Some functions can be defined using
smaller occurrences of themselves.
Such a definition is called a “recursive
definition” of a function.
26. Another example - power
X
y
= x*x*…*x
Recursive definitions (assume non-negative y):
Base: x0
=1
1. X
y
= X*(X
y-1
)
2. X
y
=(X
y/2
)
2
(for even y’s only)
y times
30. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
31. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
32. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
33. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
34. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
2*…
y
5
35. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
y
4
36. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
y
4
37. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
y
4
38. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
39. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
y
2
40. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
y
2
41. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
y
2
42. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
43. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
rec_pow(2, 1)
x
2
Returns…
y
1
44. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
rec_pow(2, 1)
x
2
Returns…
y
1
45. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
rec_pow(2, 1)
x
2
Returns…
y
1
46. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
rec_pow(2, 1)
x
2
Returns…
y
1
47. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
rec_pow(2, 1)
x
2
Returns…
2*…
y
1
48. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
rec_pow(2, 1)
x
2
Returns…
2*…
y
1
rec_pow(2, 0)
x
2
Returns…
y
0
49. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
rec_pow(2, 1)
x
2
Returns…
2*…
y
1
rec_pow(2, 0)
x
2
Returns…
y
0
50. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
rec_pow(2, 1)
x
2
Returns…
2*…
y
1
rec_pow(2, 0)
x
2
Returns…
1
y
0
51. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(…)
y
2
rec_pow(2, 1)
x
2
Returns…
2*1
y
1
52. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(…)
y
4
rec_pow(2, 2)
x
2
Returns…
square(2)
y
2
53. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
y
5
rec_pow(2, 4)
x
2
Returns…
square(4)
y
4
54. rec_pow – step by step
int rec_pow(int x, int y)
{
if (y == 0)
return 1;
if (y%2 == 0)
return square(rec_pow(x,y/2));
else
return x*rec_pow(x,y-1);
}
rec_pow(2, 5)
x
2
Returns…
2*16
y
5
55. Exercise
Write a program that receives two non-negative
integers and computes their product recursively.
Not * multiple operator !!
Hint: Notice that the product a*b is actually a+a+…
+a (b times).
57. Exercise
Given the following iterative
version of
sum-of-digits calculation
Find the recursive definition
of this function
(don’t forget the base case!)
int sum_digits(int n){
int sum = 0;
while (n > 0) {
sum += n%10;
n = n/10;
}
return sum;
}
58. Solution
int sumOfDigits( int x ) {
if( x < 0)
x *= -1;
if( x == 0 )
return 0;
else
return x % 10 + sumOfDigits( x / 10 );
}
59. More uses
Recursion is a general approach to programming
functions.
Its uses are not confined to calculating mathematical
expressions!
For example : write a function that finds the max
member in an array of integer.
60. Solution
int rec_max(int arr[ ], int size){
int rest;
if (size == 1)
return arr[0];
else {
rest = rec_max(arr+1, size-1);
if (arr[0] > rest)
return arr[0];
else
return rest;
}
}
61. int BinarySearch(int arr[],int x, int left, int right) {
int middle;
if(left>right)
return -1;
else {
middle=(left+right)/2);
if(arr[middle]==x)
return middle;
else if(x < arr[middle])
return BinarySearch(arr,x,left,middle-1);
else return BinarySearch(arr,x,middle+1,right);
}
}
62. Towers of Hanoi
The Towers of Hanoi problem consists of three rods,
and a number of disks of different sizes which can slide
onto any rod. The puzzle starts with the disks in a neat
stack in ascending order of size on one rod, the smallest at
the top, thus making a conical shape.
The objective of the puzzle is to move the entire stack to
another rod, obeying the following rules:
Only one disk may be moved at a time.
Each move consists of taking the upper disk from one of
the rods and sliding it onto another rod, on top of the
other disks that may already be present on that rod.
No disk may be placed on top of a smaller disk.
64. Recursive Solution
To move n disks from peg A to peg C:
move n−1 disks from A to B. This leaves disk #n
alone on peg A
move disk #n from A to C
move n−1 disks from B to C so they sit on disk #n
65. Recursive Solution - Function
void hanoi(int x, char from, char to, char aux){
if(x==1){
printf("Move Disk From %c to %cn", from, to);
}
else {
hanoi(x-1,from,aux,to);
printf("Move Disk From %c to %cn", from, to);
hanoi(x-1,aux,to,from);
}
}
66. Scope of variables - reminder
A variable declared within a function is
unrelated to variables declared
elsewhere.
A function cannot access variables that
are declared in other functions.