Recursion
Recursion (Wikipedia)
Recursion is the process of repeating items in a self-similar way.
Example (Fibonacci)
fibonacci(x) = x · fibonacci(x − 1)
Recursion
Recursion (Wikipedia)
Recursion is the process of repeating items in a self-similar way.
Example (Fibonacci)
fibonacci(x) = x · fibonacci(x − 1)
Recursion (John D. Cook)
Be sure of three things:
1. The problem gets smaller each time.
2. You include a solution for the base case.
3. Each case is handled correctly.
General scheme
funct ion r e c u r s i v e ( x ) i sbase c a s e → return t r i v i a l ( x )r e c u r s i v e c a s e →
y = r e c u r s i v e ( r e d u c e ( x ) )return compute ( x , y )
Example: factorial
funct ion f a c t o r i a l ( x ) i sx = 0 → return 1x > 0 →
y ← f a c t o r i a l ( x−1 )return x ∗ y
Example: product
Design the product by additions
funct ion p r o d u c t ( x , y ) i sx = 0 → return 0x > 0 →
p ← p r o d u c t ( x−1, y )return y + p
Example: product
funct ion p r o d u c t ( x , y ) i sx = 0 → return 0x > 0 →
p ← p r o d u c t ( x−1, y )return y + p
Exercises
I Digit counter for an integer
I Addition of all the elements in a list
I Check if a list is sorted
I Power by products
I Division by substrations
I Integer Division
I Maximum in a list
I Lineal search
Transformations
I Any recursive computation has each equivalent iterativecomputation, and viceversa
I The easiest transformation: tail recursion
I General Scheme:
Recursive → Tail recursive → Iterative
Transformations
I Any recursive computation has each equivalent iterativecomputation, and viceversa
I The easiest transformation: tail recursion
I General Scheme:
Recursive → Tail recursive → Iterative
Transformations
I Any recursive computation has each equivalent iterativecomputation, and viceversa
I The easiest transformation: tail recursion
I General Scheme:
Recursive → Tail recursive → Iterative
Transformations
Tail callA tail call is a subroutine call performed as the final action of aprocedure.
funct ion c a l l e r ( x ) i sy = some o p e r a t i o n sreturn c a l l e e ( y )
Tail recursionA tail recursion is a tail call which calls the caller.
funct ion c a l l e r ( x ) i sy = some o p e r a t i o n sreturn c a l l e r ( y )
Transformations
Tail callA tail call is a subroutine call performed as the final action of aprocedure.
funct ion c a l l e r ( x ) i sy = some o p e r a t i o n sreturn c a l l e e ( y )
Tail recursionA tail recursion is a tail call which calls the caller.
funct ion c a l l e r ( x ) i sy = some o p e r a t i o n sreturn c a l l e r ( y )
General scheme
funct ion r e c u r s i v e ( x ) i sbase c a s e → return t r i v i a l ( x )r e c u r s i v e c a s e →
y = r e c u r s i v e ( r e d u c e ( x ) )return compute ( x , y )
funct ion r e c u r s i v e ( x , a ) i sbase c a s e → ar e c u r s i v e c a s e →
a = compute ( x , a )return r e c u r s i v e ( r e d u c e ( x ) , a )
r e c u r s i v e ( x , t r i v i a l ( x ) )
General scheme
funct ion r e c u r s i v e ( x ) i sbase c a s e → return t r i v i a l ( x )r e c u r s i v e c a s e →
y = r e c u r s i v e ( r e d u c e ( x ) )return compute ( x , y )
funct ion r e c u r s i v e ( x , a ) i sbase c a s e → ar e c u r s i v e c a s e →
a = compute ( x , a )return r e c u r s i v e ( r e d u c e ( x ) , a )
r e c u r s i v e ( x , t r i v i a l ( x ) )
Example: factorial
funct ion f a c t o r i a l ( x ) i sx = 0 → return 1x > 0 →
y ← f a c t o r i a l ( x−1 )return x ∗ y
funct ion f a c t o r i a l ( x , a ) i sx = 0 → return ax > 0 →
a ← x ∗ areturn f a c t o r i a l ( x−1, a )
f a c t o r i a l ( x , 1 )
Example: factorial
funct ion f a c t o r i a l ( x ) i sx = 0 → return 1x > 0 →
y ← f a c t o r i a l ( x−1 )return x ∗ y
funct ion f a c t o r i a l ( x , a ) i sx = 0 → return ax > 0 →
a ← x ∗ areturn f a c t o r i a l ( x−1, a )
f a c t o r i a l ( x , 1 )
Exercises
I Digit counter for an integer
I Addition of all the elements in a list
I Check if a list is sorted
I Power by products
I Division by substrations
I Integer Division
I Maximum in a list
I Lineal search
General scheme
funct ion r e c u r s i v e ( x , a ) i sbase c a s e → ar e c u r s i v e c a s e →
return r e c u r s i v e ( r e d u c e ( x ) , compute ( x , a ) )
r e c u r s i v e ( x , t r i v i a l ( x ) ) i s
funct ion r e c u r s i v e ( x ) i sa ← t r i v i a l ( x )whi le not base c a s e ( x ) do
a ← compute ( x , a )x ← r e d u c e ( x )
return a
General scheme
funct ion r e c u r s i v e ( x , a ) i sbase c a s e → ar e c u r s i v e c a s e →
return r e c u r s i v e ( r e d u c e ( x ) , compute ( x , a ) )
r e c u r s i v e ( x , t r i v i a l ( x ) ) i s
funct ion r e c u r s i v e ( x ) i sa ← t r i v i a l ( x )whi le not base c a s e ( x ) do
a ← compute ( x , a )x ← r e d u c e ( x )
return a
Example: factorial
funct ion f a c t o r i a l ( x , a ) i sx = 0 → return ax > 0 →
a ← x ∗ areturn f a c t o r i a l ( x−1, a )
f a c t o r i a l ( x , 1 )
funct ion f a c t o r i a l ( x ) i sa ← 1whi le not x = 0 do
a ← a ∗ xx ← x − 1
return a
Example: factorial
funct ion f a c t o r i a l ( x , a ) i sx = 0 → return ax > 0 →
a ← x ∗ areturn f a c t o r i a l ( x−1, a )
f a c t o r i a l ( x , 1 )
funct ion f a c t o r i a l ( x ) i sa ← 1whi le not x = 0 do
a ← a ∗ xx ← x − 1
return a
Exercises
I Digit counter for an integer
I Addition of all the elements in a list
I Check if a list is sorted
I Power by products
I Division by substrations
I Integer Division
I Maximum in a list
I Lineal search