Lecture-13

Transcription

Lecture-13
Programming Fundamental
Instructor Name:
Lecture-13
Today’s Lecture
 What is Recursion
 Recursive Function
 General Form of Recursive Methods
 Recursive Function Call Understanding with Example
2
Recursion
What is Recursion?
 A recursive function is a function that calls itself.
 The process of solving a problem by reducing it to smaller version of itself
is called recursion.
 Recursion is very powerful way to solve certain problems for which the
solution would otherwise be very complicated.
 There are many problems and specific areas where you can see the
repetitive behaviour (pattern) or you can find a thing, which can be
modelled in such a way that it repeats itself.
 Once you understand recursive methods, they are often simpler to write
than their iterative equivalents
 We will begin by studying the form of general recursive methods and
comparing iterative and recursive solution.
3
Understanding Recursion
Handshake Problem
 There are n people in a room. If each person shakes hands once with every
other person. What is the total number h(n) of handshakes?
h(n) = h(n-1) + n-1
h(4) = h(3) + 3
h(3) = h(2) + 2
h(2) = 1
h(n): Sum of integer from 1 to n-1 = n(n-1) / 2
4
Understanding Recursion
Fund Raising : Iteration vs Recursion
 Problem: Collect $1,000.00 for charity
Assumption: Everyone is willing to donate a penny
Iterative Solution
 Visit 100,000 people, asking each for a penny
Recursive Solution
 If you are asked to collect a penny, give a penny to the person who asked
you for it
 Otherwise
 Visit 10 people and ask them to each raise 1/10th of the amount of
money that you have been asked to raise
 Collect the money that they give you and combine it into one bag
 Give it to the person who asked you to collect the money
5
Recursion
A recursive function is a function that calls itself.[
Recursive problem-solving approaches have a number of elements
in common.
Recursive Function has two parts
(i) Base Case(s).
The function actually knows how to solve only the simplest
case(s),
If the function is called with a base case, the function simply
returns a result.
(ii) Complex Case(s)
If the function is called with a more complex problem, It
typically divides the problem into two conceptual pieces.
a) A piece that the function knows how to do and
b) A piece that it does not know how to do
Complex Case(s)
 To make recursion feasible, the latter piece must resemble the
original problem
 But be a slightly simpler or slightly smaller version.
 Function launches (calls) a fresh copy of itself to work on the
smaller problem this is referred to as a recursive call and is also
called the recursion step.
 The recursion step often includes the keyword return,
General Form of Recursive Methods
Solve(Problem)
{
if (Problem is minimal/not decomposable: a base case)
solve Problem directly; i.e., without recursion
else {
(1) Decompose Problem into one or more similar,
strictly smaller subproblems: SP1, SP2, ... , SPN
(2) Recursively call Solve (this method) on each
subproblem: Solve(SP1), Solve(SP2),..., Solve(SPN)
(3) Combine the solutions to these subproblems into a
solution that solves the original Problem
}
}
8
General Form of Recursive Methods
 A recursive definition has two parts:
 the base case - a stopping condition
 the recursive step - an expression of the computation or definition in
terms of itself
 There are many recursive definitions in mathematics. Consider the
factorial function:
n! = n * (n-1) * (n -2) * … * 2 * 1
 The same function can be defined recursively by giving a base case and a
recursive step:
0! = 1 (by definition)
n! = n * (n - 1)! (the recursive step)
9
Understanding Recursive Methods
 In some problems, it may be natural to define the problem in terms of
the problem itself.
 Recursion is useful for problems that can be represented by a simpler
version of the same problem.
 Example: the factorial function
6! = 6 * 5 * 4 * 3 * 2 * 1
We could write:
6! = 6 * 5!
 In general, we can express the factorial function as follows:
n! = n * (n-1)!
Is this correct? Well… almost.
 The factorial function is only defined for positive integers. So we
should be a bit more precise:
n! = 1
(if n is equal to 1)
n! = n * (n-1)!
(if n is larger than 1)
10
Understanding Recursive Methods
Factorial Function
The C++ equivalent of this definition:
int fac(int numb){
if(numb<=1)
return 1;
else
return numb * fac(numb-1);
}
11
Understanding Recursive Methods
Assume the number typed is 3, that is, numb=3.
fac(3) :
3 <= 1 ?
fac(3) = 3 * fac(2)
No.
fac(2) :
2 <= 1 ?
No.
fac(2) = 2 * fac(1)
fac(1) :
1 <= 1 ? Yes.
return 1
fac(2) = 2 * 1 = 2
return fac(2)
fac(3) = 3 * 2 = 6
return fac(3)
fac(3) has the value 6
int fac(int numb){
if(numb<=1)
return 1;
else
return numb * fac(numb-1);
}
12
Understanding Recursive Methods
Assume the number typed is 4, that is, numb=4.
int fac(int numb){
if(numb<=1)
return 1;
else
return numb * fac(numb-1);
}
13
Understanding Recursive Methods
Assume the number typed is 5, that is, numb=5.
14
Factorial Function Iterative Vs Recursive
For certain problems (such as the factorial function), a recursive solution often
leads to short and elegant code. Compare the recursive solution with the
iterative solution:
Recursive solution
int fac(int numb){
if(numb<=1)
return 1;
else
return numb*fac(numb-1);
}
Iterative solution
int fac(int numb){
int product=1;
while(numb>1){
product *= numb;
numb--;
}
return product;
}
15
Understanding Recursive Methods
Fibonacci Sequence
 The Fibonacci Sequence is the series of numbers:
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...
 The next number is found by adding up the two numbers before it.
 The 2 is found by adding the two numbers before it (1+1)
 Similarly, the 3 is found by adding the two numbers before it (1+2),
 And the 5 is (2+3),
 and so on!
Example: the next number in the sequence above is 21+34 = 55
16
Understanding Recursive Methods
Fibonacci Sequence – Recursive Definition
F(0) = 0;
F(1) = 1;
F(number) = F(number-1)+ F(number-2);
C++ Recursive function for Fibonacci sequence
int fib(int number)
{
if (number == 0) return 0;
if (number == 1) return 1;
return (fib(number-1) + fib(number-2));
}
17
Fibonacci Sequence - Recursive Methods
18
Fibonacci Sequence - Recursive Methods
• Assume the input number is 4, that is, num=4:
fib(4):
4 == 0 ? No; 4 == 1? No.
fib(4) = fib(3) + fib(2)
fib(3):
3 == 0 ? No; 3 == 1? No.
fib(3) = fib(2) + fib(1)
fib(2):
2 == 0? No; 2==1? No.
fib(2) = fib(1)+fib(0)
fib(1):
1== 0 ? No; 1 == 1? Yes.
fib(1) = 1;
return fib(1);
int fib(int num)
{
if (num == 0) return 0;
if (num == 1) return 1;
return
(fib(num-1)+fib(num-2));
}
19
Fibonacci Sequence - Recursive Methods
Trace a Fibonacci Number
fib(0):
0 == 0 ? Yes.
fib(0) = 0;
return fib(0);
fib(2) = 1 + 0 = 1;
return fib(2);
fib(3) = 1 + fib(1)
fib(1):
1 == 0 ? No; 1 == 1? Yes
fib(1) = 1;
return fib(1);
fib(3) = 1 + 1 = 2;
return fib(3)
20
Fibonacci Sequence - Recursive Methods
Trace a Fibonacci Number
fib(2):
2 == 0 ? No; 2 == 1? No.
fib(2) = fib(1) + fib(0)
fib(1):
1== 0 ? No; 1 == 1? Yes.
fib(1) = 1;
return fib(1);
fib(0):
0 == 0 ? Yes.
fib(0) = 0;
return fib(0);
fib(2) = 1 + 0 = 1;
return fib(2);
fib(4) = fib(3) + fib(2)
= 2 + 1 = 3;
return fib(4);
21
Example
The Fibonacci Series
long fab (long);
main()
{
int i;
Cin>>I;
cout<<"fabonaci"<<i<<"="<<fab(i)<<endl;
getch();
}
long fab(long x)
{
if (x==1 || x==0)
return x;
else
return (fab(x-1)+fab(x-2));
}
Important (Iteration & Recursion)
If we use iteration, we must be careful not to create an infinite loop by
accident:
for(int incr=1; incr!=10;incr+=2)
...
Oops!
int result = 1;
while(result >0){
...
result++;
}
Oops!
Similarly, if we use recursion we must be careful not to create an infinite
chain of function calls:
int fac(int numb){
return numb * fac(numb-1);
}
Oops!
int fac(int numb){
if (numb<=1)
return 1;
else
return numb * fac(numb+1);
}
Oops!
23
Important (Iteration & Recursion)
Recursion
 We must always make sure that recursion bottoms out
 A recursive function must contains at least one non recursive branch
 The recursive call must eventually leads to non recursive branch
 Recursion is one way to decompose a task into smaller subtasks. At least
one of the subtasks is a smaller example of the same task.
 The smallest example of the same task has a non-recursive solution.
Example: The factorial function
n! = n * (n-1)! and 1! = 1
24
Home Practice
Home Practice - Recursion
 Write a recursive solution to compute sum of first n integers
 Write a recursive solution to computer sum of first n odd and even integers
 Write a recursive solution that counts the numbers of zero digits in an
integer
for example zeros(10200) returns 3
 Write a exponential Functional that recursively computes
np
 An important function in probability is the binomial coefficient, or choose,
function, written B(n,k), and defined as:
B(n,k) = n! / k!(n - k)! n≥0, 0<=k≤n
Write recursive solution based on following recursive formula
B(n, k) = B(n − 1, k − 1) + B(n − 1, k).
25
26