Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do?...

14
Recursion
  • date post

    18-Dec-2015
  • Category

    Documents

  • view

    224
  • download

    0

Transcript of Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do?...

Page 1: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

Recursion

Page 2: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 2

Recursion: Example 0 What does the following program do?

#include <iostream>using namespace std;int fac(int n){

// Assume n >= 0int product;if(n <= 1)

return 1;product = n * fac(n-1);return product;

}void main(){ // driver function

int number;do{

cout << "Enter integer (negative to stop): ";cin >> number;if(number >= 0)

cout << fac(number) << endl;}while(number >= 0);

}

Page 3: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 3

Recursion: Example 0 Assume the number typed is 3. fac(3) :

3 <= 1 ? No.

product3 = 3 * fac(2)fac(2) :

2 <= 1 ? No.

product2 = 2 * fac(1)fac(1) :

1 <= 1 ? Yes.return 1

product2 = 2 * 1 = 2

return product2

product3 = 3 * 2 = 6

return product3

fac(3) has the value 6

Page 4: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 4

Recursion

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 functionn! = n * (n-1) * (n-2) * ... * 1orn! = n * (n-1)! and 1! = 1

Page 5: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 5

Recursion A recursive solution may be simpler to

write (once you get used to the idea) than a non-recursive solution.

But a recursive solution may not be as efficient as a non-recursive solution of the same problem.

Page 6: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 6

Iterative Factorial

// Non-recursive factorial function// Compute the factorial using a loopint fac(int n){

// Assume n >= 0int k, product;if(n <=1)

return 1;product = 1;for(k=1; k<=n; k++)

product*= k;return product;

}

Page 7: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 7

Other Recursive Applications

Fibonacci numbers:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, ...

where each number is the sum of the preceding two.

Recursive definition: F(0) = 0 F(1) = 1 F(n) = F(n-1) + F(n-2)

Page 8: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 8

Other Recursive ApplicationsBinary search:

Compare search element with middle element of the array:

If not equal, then apply binary search to half of the array (if not empty) where the search element would be.

Page 9: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 9

Recursion General Form

How to write recursively?

int rec(1-2 parameters){

if(stopping condition)

return stopping value;

// second stopping condition if needed

return value/rec(revised parameters)

+-*/ rec(revised parameters);

}

Page 10: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 10

Recursion: Example 1

How to write exp(int x, int y) recursively?

int exp(int x, int y){if(y==0)

return 1;return x * exp(x, y-1);

}

Page 11: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 11

Recursion: Example 2

Write a recursive function that takes a double array and its size as input and returns the sum of the array:

double asum(int a[], int size){if(size==0)

return 0;return asum(a, size-1)+a[size-

1];}

Page 12: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 12

Recursion: Example 3

Write a recursive function that takes a double array and its size as input and returns the product of the array:

double aprod(int a[], int size){if(size==0)

return 1;return aprod(a, size-1)*a[size-

1];}

Page 13: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 13

Recursion: Example 4

Write a recursive function that counts the number of zero digits in a non-negative integer

zeros(10200) returns 3

int zeros(int n){if(n==0)

return 1;if(n < 10)

return 0;if(n%10 == 0)

return 1 + zeros(n/10);else

return zeros(n/10);}

Page 14: Recursion. COMP104 Recursion / Slide 2 Recursion: Example 0 * What does the following program do? #include using namespace std; int fac(int n){ // Assume.

COMP104 Recursion / Slide 14

Recursion: Example 5

Write a recursive function to determine how many factors m are part of n. For example, if n=48 and m=4, then the result is 2 (48=4*4*3).

int factors(int n, int m){if(n%m != 0)

return 0;return 1 + factors(n/m, m);

}