3 - Recursion
3 - Recursion
Manolis Koubarakis
sum=0;
for (i=m; i<=n; ++i) sum +=i*i;
return sum;
}
if (m==n) {
return m*m; Base case
} else {
middle=(m+n)/2;
return
SumSquares(m,middle)+SumSquares(middle+1,n);
}
}
Recursive call Recursive call
Data Structures and Programming
8
Techniques
Comments
• The recursion here says that the sum of the squares of the
integers in the range m:n can be obtained by adding the
sum of the squares of the left half range, m:middle, to
the sum of the squares of the right half range,
middle+1:n.
SumSquares(5,7) SumSquares(8,10)
SumSquares(8,8) SumSquares(9,9)
SumSquares(5,5) SumSquares(6,6)
110 245
SumSquares(5,7) SumSquares(8,10)
61 145
SumSquares(5,6) SumSquares(7,7)SumSquares(8,9) SumSquares(10,10)
49 100
SumSquares(8,8) SumSquares(9,9)
SumSquares(5,5) SumSquares(6,6) 81
64
25 36
Data Structures and Programming
12
Techniques
Traces
SumSquares(5,10)=SumSquares(5,7)+SumSquares(8,10)=
=SumSquares(5,6)+SumSquares(7,7)
+SumSquares(8,9)+SumSquares(10,10)
=SumSquares(5,5)+SumSquares(6,6)
+SumSquares(7,7)
+SumSquares(8,8)+SumSquares(9,9)
+SumSquares(10,10)
=((25+36)+49)+((64+81)+100)
=(61+49)+(145+100)
=(110+245)
=355
int Factorial(int n)
{
int i, f;
f=1;
for (i=2; i<=n; ++i) f*=i;
return f;
}
if (m==n) {
return m; Base case
} else {
middle=(m+n)/2;
return Product(m,middle)*Product(middle+1,n);
}
}
Recursive call
Recursive call
Data Structures and Programming
18
Techniques
Reversing a Linked List
L1=*L;
R=NULL;
while (L1 != NULL) {
N=L1;
L1=L1->Link;
N->Link=R;
R=N;
}
*L=R;
}
L .
L1 R
N L1 R
L .
N L1 R
L .
N L1 R
if (L==NULL) {
return NULL;
} else {
Partition(L, &Head, &Tail);
return Concat(Reverse(Tail), Head);
}
}
Head* Tail*
Head Tail
Data Structures and Programming
38
Techniques
Reversing Linked Lists: Concatenation
NodeType *Concat(NodeType *L1, NodeType *L2)
{
NodeType *N;
if (L1 == NULL) {
return L2;
} else {
N=L1;
while (N->Link != NULL) N=N->Link;
N->Link=L2;
return L1;
}
}
L2
L2
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3