SlideShare a Scribd company logo
Recursion
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;
}
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.
Recursive calling
Example:
void func(int n){
putchar(`*`);
func(n);
}
Infinite series of *
What is the problem ?
Look for other problem …
Factorial
By definition :
n! = 1*2*3*… *(n-1)*n
Thus, we can also define factorial the following way:
 0! = 1
 n! = n*(n-1)! for n>0
(n-1)! *n
Example - factorial
int factRec(int n){
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
int factorial(int n){
int fact = 1;
while (n >= 1) {
fact *=n;
n--;
}
return fact;
}
Conclusions for Recursive calling
Every recursive function has a “boundary
condition”. The function stops calling itself when it
is satisfied.
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
4*…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
3*…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
FactRec(2)
n
2
Returns…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
FactRec(2)
n
2
Returns…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
FactRec(2)
n
2
Returns…
2*…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
FactRec(2)
n
2
Returns…
FactRec(1)
n
1
Returns…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
FactRec(2)
n
2
Returns…
FactRec(1)
n
1
Returns…
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
FactRec(2)
n
2
Returns…
FactRec(1)
n
1
Returns…
1
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
FactRec(2)
n
2
Returns…
2*1
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
FactRec(3)
n
3
Returns…
3*2
Recursive factorial – step by step
int factRec(int n)
{
if (n==0 || n==1)
return 1;
return n*factRec(n-1);
}
FactRec(4)
n
4
Returns…
4*6
1
#include <stdio.h>
void print1(int n){
if (n>=0){
printf("%d ",n);
print1(n-1);
{
{
void main(){
int i = 3;
print1(i);
putchar('n');
{
3 2 1 0
2
#include <stdio.h>
void print2(int n){
if (n>=0){
print2(n-1);
printf("%d ",n);
{
{
void main(){
int i = 3;
print2(i);
putchar('n');
{
0 1 2 3
3
#include <stdio.h>
void print3(int n){
if (n>=0){
printf("%d ",n);
print3(n-1);
printf("%d ",n);
{
{
void main(){
int i = 3;
print3(i);
putchar('n');
{
3 2 1 0 0 1 2 3
4
#include <stdio.h>
void print4(int n){
if (n>=0){
print4(n-1);
printf("%d ",n);
print4(n-1);
{
{
void main(){
int i = 3;
print4(i);
putchar('n');
{
0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
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
Fibonacci Series
Fibonacci definition:
 n0 = 0
 n1 = 1
 nn = nn-1 + nn-2
0 1 1 2 3 5 8 13 21 34 55 …
Fibonacci Iterative
void fibonacci(int n) {
int Fn, Fn1, Fn2, ind;
Fn2 = 0 ;
Fn1 = 1 ;
Fn = 0 ;
if ( n == 1 )
Fn = 1 ;
for (ind=2 ; ind <= n ; ind++){
Fn = Fn1 + Fn2;
Fn2 = Fn1;
Fn1 = Fn;
}
printf("F(%d) = %d n", n, Fn);
}
Fibonacci Recursive
fibonacci(1)
fibonacci(5)
fibonacci(4) fibonacci(3)
fibonacci(3) fibonacci(2) fibonacci(2)
fibonacci(1)
fibonacci(2) fibonacci(1) fibonacci(1)
fibonacci(0)
fibonacci(0) fibonacci(1) fibonacci(0)
int fibonacci(int n) {
if (n==0)
return 0;
if (n==1)
return 1;
return fibonacci(n-1) + fibonacci(n-2);
}
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 – 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 – 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 – 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 – 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
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
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
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
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 – 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
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
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
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 – 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
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
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
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
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 – 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
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
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
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
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
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
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
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).
Solution
int recMult( int x, int y ) {
if( x == 0)
return 0;
return y + recMult( x-1,y);
{
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;
}
Solution
int sumOfDigits( int x ) {
if( x < 0)
x *= -1;
if( x == 0 )
return 0;
else
return x % 10 + sumOfDigits( x / 10 );
}
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.
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;
}
}
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);
}
}
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.
Towers of Hanoi
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
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);
}
}
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.

More Related Content

PPTX
Recursion
PPT
Data Structures- Part5 recursion
PDF
Iterations and Recursions
PPT
Recursion
PPTX
Recursion
PDF
Introduction to Recursion (Python)
PPT
Ch10 Recursion
Recursion
Data Structures- Part5 recursion
Iterations and Recursions
Recursion
Recursion
Introduction to Recursion (Python)
Ch10 Recursion

What's hot (20)

PPS
Let Us Learn Lambda Using C# 3.0
PPTX
Recursion(Advanced data structure)
PPTX
Lecture09 recursion
PDF
CPSC 125 Ch 2 Sec 4
PPT
Primitive Recursive Functions
PPT
functions
PPTX
5.2 primitive recursive functions
PPTX
Asymptotic Notation
PDF
01. design & analysis of agorithm intro & complexity analysis
PPTX
Mathematical Analysis of Recursive Algorithm.
PPT
Induction
PPT
Algorithm.ppt
PPTX
Control System Homework Help
PDF
6-Python-Recursion.pdf
PDF
Divide and Conquer
PDF
Algorithm chapter 2
PDF
Folding Unfolded - Polyglot FP for Fun and Profit - Haskell and Scala
PPT
PPTX
Functions
Let Us Learn Lambda Using C# 3.0
Recursion(Advanced data structure)
Lecture09 recursion
CPSC 125 Ch 2 Sec 4
Primitive Recursive Functions
functions
5.2 primitive recursive functions
Asymptotic Notation
01. design & analysis of agorithm intro & complexity analysis
Mathematical Analysis of Recursive Algorithm.
Induction
Algorithm.ppt
Control System Homework Help
6-Python-Recursion.pdf
Divide and Conquer
Algorithm chapter 2
Folding Unfolded - Polyglot FP for Fun and Profit - Haskell and Scala
Functions
Ad

Similar to Recursion (20)

PDF
062636636366363773737373733+73737733+7.pdf
PPTX
06 Recursion in C.pptx
PDF
Recursion examples
PDF
Recursion.pdf
PPTX
PPT
Lec-32 Recursion - Divide and Conquer in Queue
PPT
14 recursion
PPT
lecture 10 Recursive Function and Macros.ppt
PDF
Chapter VII RECURSION.pdf algor and data structure
PPT
Basic_analysis.ppt
PPT
chapter1.ppt
PPT
chapter1.ppt
PPTX
Introduction to Dynamic Programming.pptx
PPT
Lec-6 Recursion of Data Structures & Algorithms
DOCX
Recursion in C
PDF
C and Data Structures Lab Solutions
PDF
C lab excellent
PDF
C and Data Structures
PDF
DS & Algo 2 - Recursion
PPT
Lecture9 recursion
062636636366363773737373733+73737733+7.pdf
06 Recursion in C.pptx
Recursion examples
Recursion.pdf
Lec-32 Recursion - Divide and Conquer in Queue
14 recursion
lecture 10 Recursive Function and Macros.ppt
Chapter VII RECURSION.pdf algor and data structure
Basic_analysis.ppt
chapter1.ppt
chapter1.ppt
Introduction to Dynamic Programming.pptx
Lec-6 Recursion of Data Structures & Algorithms
Recursion in C
C and Data Structures Lab Solutions
C lab excellent
C and Data Structures
DS & Algo 2 - Recursion
Lecture9 recursion
Ad

More from James Wong (20)

PPT
Data race
PPT
Multi threaded rtos
PPTX
Business analytics and data mining
PPTX
Data mining and knowledge discovery
PPTX
Cache recap
PPTX
Big picture of data mining
PPTX
How analysis services caching works
PPTX
Optimizing shared caches in chip multiprocessors
PPTX
Directory based cache coherence
PPT
Abstract data types
PPTX
Abstraction file
PPTX
Hardware managed cache
PPTX
Object model
PPT
Abstract class
PPTX
Object oriented analysis
PPTX
Concurrency with java
PPTX
Data structures and algorithms
PPTX
Cobol, lisp, and python
PPTX
Inheritance
PPTX
Api crash
Data race
Multi threaded rtos
Business analytics and data mining
Data mining and knowledge discovery
Cache recap
Big picture of data mining
How analysis services caching works
Optimizing shared caches in chip multiprocessors
Directory based cache coherence
Abstract data types
Abstraction file
Hardware managed cache
Object model
Abstract class
Object oriented analysis
Concurrency with java
Data structures and algorithms
Cobol, lisp, and python
Inheritance
Api crash

Recently uploaded (20)

PPTX
1. Introduction to Computer Programming.pptx
PDF
Encapsulation_ Review paper, used for researhc scholars
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PDF
NewMind AI Weekly Chronicles - August'25-Week II
PDF
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
PPTX
Programs and apps: productivity, graphics, security and other tools
PDF
Heart disease approach using modified random forest and particle swarm optimi...
PDF
Encapsulation theory and applications.pdf
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Advanced methodologies resolving dimensionality complications for autism neur...
PPTX
Group 1 Presentation -Planning and Decision Making .pptx
PPT
Teaching material agriculture food technology
PDF
Empathic Computing: Creating Shared Understanding
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PDF
Machine learning based COVID-19 study performance prediction
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PPTX
cloud_computing_Infrastucture_as_cloud_p
PDF
Approach and Philosophy of On baking technology
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
1. Introduction to Computer Programming.pptx
Encapsulation_ Review paper, used for researhc scholars
SOPHOS-XG Firewall Administrator PPT.pptx
NewMind AI Weekly Chronicles - August'25-Week II
Architecting across the Boundaries of two Complex Domains - Healthcare & Tech...
Programs and apps: productivity, graphics, security and other tools
Heart disease approach using modified random forest and particle swarm optimi...
Encapsulation theory and applications.pdf
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Advanced methodologies resolving dimensionality complications for autism neur...
Group 1 Presentation -Planning and Decision Making .pptx
Teaching material agriculture food technology
Empathic Computing: Creating Shared Understanding
Accuracy of neural networks in brain wave diagnosis of schizophrenia
Machine learning based COVID-19 study performance prediction
gpt5_lecture_notes_comprehensive_20250812015547.pdf
cloud_computing_Infrastucture_as_cloud_p
Approach and Philosophy of On baking technology
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf

Recursion

  • 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.
  • 4. Recursive calling Example: void func(int n){ putchar(`*`); func(n); } Infinite series of * What is the problem ? Look for other problem …
  • 5. Factorial By definition : n! = 1*2*3*… *(n-1)*n Thus, we can also define factorial the following way:  0! = 1  n! = n*(n-1)! for n>0 (n-1)! *n
  • 6. Example - factorial int factRec(int n){ if (n==0 || n==1) return 1; return n*factRec(n-1); } int factorial(int n){ int fact = 1; while (n >= 1) { fact *=n; n--; } return fact; }
  • 7. Conclusions for Recursive calling Every recursive function has a “boundary condition”. The function stops calling itself when it is satisfied.
  • 8. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns…
  • 9. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… 4*…
  • 10. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns…
  • 11. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns…
  • 12. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns… 3*…
  • 13. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns… FactRec(2) n 2 Returns…
  • 14. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns… FactRec(2) n 2 Returns…
  • 15. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… 2*…
  • 16. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… FactRec(1) n 1 Returns…
  • 17. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… FactRec(1) n 1 Returns…
  • 18. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… FactRec(1) n 1 Returns… 1
  • 19. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns… FactRec(2) n 2 Returns… 2*1
  • 20. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… FactRec(3) n 3 Returns… 3*2
  • 21. Recursive factorial – step by step int factRec(int n) { if (n==0 || n==1) return 1; return n*factRec(n-1); } FactRec(4) n 4 Returns… 4*6
  • 22. 1 #include <stdio.h> void print1(int n){ if (n>=0){ printf("%d ",n); print1(n-1); { { void main(){ int i = 3; print1(i); putchar('n'); { 3 2 1 0
  • 23. 2 #include <stdio.h> void print2(int n){ if (n>=0){ print2(n-1); printf("%d ",n); { { void main(){ int i = 3; print2(i); putchar('n'); { 0 1 2 3
  • 24. 3 #include <stdio.h> void print3(int n){ if (n>=0){ printf("%d ",n); print3(n-1); printf("%d ",n); { { void main(){ int i = 3; print3(i); putchar('n'); { 3 2 1 0 0 1 2 3
  • 25. 4 #include <stdio.h> void print4(int n){ if (n>=0){ print4(n-1); printf("%d ",n); print4(n-1); { { void main(){ int i = 3; print4(i); putchar('n'); { 0 1 0 2 0 1 0 3 0 1 0 2 0 1 0
  • 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
  • 27. Fibonacci Series Fibonacci definition:  n0 = 0  n1 = 1  nn = nn-1 + nn-2 0 1 1 2 3 5 8 13 21 34 55 …
  • 28. Fibonacci Iterative void fibonacci(int n) { int Fn, Fn1, Fn2, ind; Fn2 = 0 ; Fn1 = 1 ; Fn = 0 ; if ( n == 1 ) Fn = 1 ; for (ind=2 ; ind <= n ; ind++){ Fn = Fn1 + Fn2; Fn2 = Fn1; Fn1 = Fn; } printf("F(%d) = %d n", n, Fn); }
  • 29. Fibonacci Recursive fibonacci(1) fibonacci(5) fibonacci(4) fibonacci(3) fibonacci(3) fibonacci(2) fibonacci(2) fibonacci(1) fibonacci(2) fibonacci(1) fibonacci(1) fibonacci(0) fibonacci(0) fibonacci(1) fibonacci(0) int fibonacci(int n) { if (n==0) return 0; if (n==1) return 1; return fibonacci(n-1) + fibonacci(n-2); }
  • 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).
  • 56. Solution int recMult( int x, int y ) { if( x == 0) return 0; return y + recMult( x-1,y); {
  • 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.