Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
and
Dynamic Programing
Recursion
Basic problem solving technique is to divide a
problem into smaller subproblems
These subproblems may also be divided into
smaller subproblems
When the subproblems are small enough to
solve directly the process stops
A recursive algorithm is a problem solution
that has been expressed in terms of two or
more easier to solve subproblems
What is recursion?
A procedure that is defined in terms of itself
In a computer language a function that calls
itself
Recursion
The definition of the natural numbers:
1 is a natural number
N=
A mathematical look
We are familiar with
f(x) = 3x+5
How about
f(x) = 3x+5
f(x) = f(x+2) -3
if x > 10 or
otherwise
Calculate f(5)
f(x) = 3x+5
if x > 10 or
f(x) = f(x+2) -3
otherwise
f(5) = f(7)-3
f(7) = f(9)-3
f(9) = f(11)-3
f(11) = 3(11)+5
= 38
But we have not determined what f(5) is yet!
Calculate f(5)
f(x) = 3x+5
if x > 10 or
f(x) = f(x+2) -3
otherwise
f(5) = f(7)-3 = 29
f(7) = f(9)-3 = 32
f(9) = f(11)-3 = 35
f(11) = 3(11)+5
= 38
Working backwards we see that f(5)=29
Series of calls
f(5)
f(7)
f(9)
f(11)
Recursion
Recursion occurs when a function/procedure calls itself.
A function which calls itself is called a recursive function
There must be a base case; which is directly solveable
Break problem into smaller subproblems recursively until
base case is reached.
Solve base case and move upwards to solve larger
problems, and eventually original problem is solved
In C++ Function may call itself in the return statement
Many algorithms can be best described in terms of
recursion.
Recursive Definition
n! =
5! = 5 * 4!
4! = 4 * 3!
3! = 3 * 2!
2! = 2 * 1!
1! = 1 * 0!
1,
n * (n-1)!
if n = 0
if n > 0
= 5 * 24 = 120
= 4 * 3! = 4 * 6 = 24
= 3 * 2! = 3 * 2 = 6
= 2 * 1! = 2 * 1 = 2
= 1 * 0! = 1
fib(n) =
1,
n <= 2
fib(n-1) + fib(n-2), n > 2
fib(3) = 1 + 1 = 2
fib(4) = 2 + 1 = 3
fib(5) = 2 + 3 = 5
Recursive Definition
int BadFactorial(n){
int x = BadFactorial(n-1);
if (n == 1)
return 1;
else
return n*x;
}
Recursive Definition
int BadFactorial(n){
int x = BadFactorial(n-1);
if (n == 1)
return 1;
else
return n*x;
}
Counting Digits
Recursive definition
digits(n) = 1
if (9 <= n <= 9)
1 + digits(n/10) otherwise
Example
digits(321) =
1 + digits(321/10) = 1 +digits(32) =
1 + [1 + digits(32/10)] = 1 + [1 + digits(3)] =
1 + [1 + (1)] =
3