1




       Recursive
Data Structure & Algorithm
                      7/20/2009




          Part II
       Prepared by
  Nor Bahiah Hj Ahmad
2

                                       7/20/2009




Objectives
At the end of the class students should be able to:

• Identify problem solving characterestics using
  recursive.
• Trace the implementation of recursive function.
• Write recursive function in solving a problem
3

                                      7/20/2009




Introduction
• Repetitive algorithm is a process wherby a
  sequence of operations is executed repeatedly
  until certain condition is achieved.
• Repetition can be implemented using loop :
  while, for or do..while.
• Besides repetition using loop, C++ allow
  programmers to implement recursive.
• Recursive is a repetitive process in which an
  algorithm calls itself.
4

                                        7/20/2009




Introduction
• Recursion can be used to replace loops.
• Recursively defined data structures, like lists, are
  very well-suited to processing by recursive
  procedures and functions
• A recursive procedure is mathematically more
  elegant than one using loops.
• Sometimes procedures that would be tricky to
  write using a loop are straightforward using
  recursion.
5

                                      7/20/2009




Introduction
• Recursive is a powerful problem solving
  approach, since problem solving can be
  expressed in an easier and neat approach.

• Drawback : Execution running time for recursive
  function is not efficient compared to loop, since
  every time a recursive function calls itself, it
  requires multiple memory to store the internal
  address of the function.
6

                                      7/20/2009




Recursive solution

• Not all problem can be solved using recursive.
• Problem that can be solved using recursive is a
  problem that can be solved by breaking the
  problem into smaller instances of problem, solve
  & combine
7

                                     7/20/2009




Understanding recursion
Every recursive definition has 2 parts:
• BASE CASE(S): case(s) so simple that they can
  be solved directly
• RECURSIVE CASE(S): more complex – make
  use of recursion to solve smaller subproblems &
  combine into a solution to the larger problem
8

                                    7/20/2009




Rules for Designing Recursive
Algorithm

1.Determine the base case - There is one or more
  terminal cases whereby the problem will be
  solved without calling the recursive function
  again.
2.Determine the general case – recursive call by
  reducing the size of the problem
3.Combine the base case and general case into an
  algorithm
9

                                             7/20/2009




Designing Recursive Algorithm
• Recursive algorithm.
  if (terminal case is reached) // base case
  <solve the problem>                                    Base case
                                                         and general
  else                         // general case           case is
  < reduce the size of the problem and                   combined
     call recursive function >
10

                          7/20/2009




Classic examples

• Multiplying numbers
• Find Factorial value.
• Fibonacci numbers
11

                                         7/20/2009




Multiply 2 numbers using Addition
Method
• Multiplication of 2 numbers can be achieved by
  using addition method.
• Example :
   To multiply 8 x 3, the result can also be achieved
   by adding value 8, 3 times as follows:

           8 + 8 + 8 = 24
12

                            7/20/2009




Implementation of Multiply()
using loop
int Multiply(int M,int N)
{ for (int i=1,i<=N,i++)
    result += M;
  return result;
}//end Multiply()
13

                                         7/20/2009




Solving Multiply problem recursively
Steps to solve Multiply() problem recursively:
• Problem size is represented by variable N. In this
  example, problem size is 3. Recursive function will
  call Multiply() repeatedly by reducing N by 1 for
  each respective call.
• Terminal case is achieved when the value of N is 1
  and recursive call will stop. At this moment, the
  solution for the terminal case will be computed and
  the result is returned to the called function.
• The simple solution for this example is represented
  by variable M. In this example, the value of M is 8.
14

                                7/20/2009




Implementation of recursive
function: Multiply()
  int Multiply (int M,int N)
  {
    if (N==1)
      return M;
    else
      return M + Multiply(M,N-1);
  }//end Multiply()
15

                                          7/20/2009




Recursive algorithm
3 important factors for recursive
  implementation:
• There’s a condition where the function will stop
  calling itself. (if this condition is not fulfilled,
  infinite loop will occur)
• Each recursive function call, must return to the
  called function.
• Variable used as condition to stop the recursive
  call must change towards terminal case.
16

                                                   7/20/2009


Tracing Recursive Implementation for Multiply().
17


Returning the Multiply() result to the
                             7/20/2009




called function
Exercise Week 3_1
• Refer to Exercise 1 No. 2 in pg. 2.
• Solve the problem.
19

                                                7/20/2009




Factorial Problem
• Problem : Get Factorial value for a positive
  integer number.
• Solution : The factorial value can be achieved as
  follows:
   0! is equal to 1
   1! is equal to 1 x 0! = 1 x 1 = 1
   2! is equal to 2 x 1! = 2 x 1 x 1 = 2
   3! is equal to 3 x 2! = 3 x 2 x 1 x 1 = 6
   4! is equal to 4 x 3! = 4 x 3 x 2 x 1 x 1 = 24
   N! is equal to N x (N-1)! For every N>0
20

                                        7/20/2009




Solving Factorial Recursively
1. The simple solution for this example is
   represented by the factorial value equal to 1.
2. N, represent the factorial size. The recursive
   process will call factorial() function recursively
   by reducing N by 1.
3. Terminal case for factorial problem is when N
   equal to 0. The computed result is returned to
   called function.
21

                                                   7/20/2009




Factorial function
  Here’s a function that computes the factorial of a number N
  without using a loop.
• It checks whether N is equal 0. If so, the function just return 1.
• Otherwise, it computes the factorial of (N – 1) and multiplies
  it by N.

      int Factorial (int N )
      { /*start Factorial*/
      if (N==0)
            return 1;
      else
            return N * Factorial (N-1);
      } /*end Factorial
22

                            7/20/2009



Execution of Factorial(3)
23

                            7/20/2009




Terminal case for Factorial(3)
24

               7/20/2009




Return
value for
Factorial(3)
25

                                                   7/20/2009




Fibonacci Problem
• Problem : Get Fibonacci series for an integer
  positive.
• Fibonacci Siries : 0, 1, 1, 2, 3, 5, 8, 13, 21,…..
• Starting from 0 and and have features that every
  Fibonacci series ia the result of adding 2 previous
  Fibonacci numbers.
• Solution: Fibonacci value of a number can be computed
  as follows:
    Fibonacci ( 0) = 0
    Fibonacci ( 1) = 1
    Fibonacci ( 2) = 1
    Fibonacci ( 3) = 2
    Fibonacci ( N) = Fibonacci (N-1) + Fibonacci (N-2)
26

                                     7/20/2009




Solving Fibonacci Recursively
1. The simple solution for this example is
   represented by the Fibonacci value equal to 1.
2. N, represent the series in the Fibonacci
   number. The recursive process will integrate
   the call of two Fibonacci () function.
3. Terminal case for Fibonacci problem is when N
   equal to 0 or N equal to 1. The computed
   result is returned to the called function.
27

                                 7/20/2009




Fibonacci() function
int Fibonacci (int N )
{ /* start Fibonacci*/
     if (N<=0)
          return 0;
     else if (N==1)
          return 1;
     else
  return Fibonacci(N-1) + Fibonacci (N-2);
}
28

                                   7/20/2009




Implementation of Fibonacci() :
passing and returning value from
function.
Exercise Week 3_1
• Refer to Exercise 1 No. 4.iii. in pg. 4.
• Solve the problem.

• Refer to Exercise 2 No. 1 in pg. 4.
• Solve the problem.
30

                                         7/20/2009




Infinite Recursive
• Avoiding infinite(?) recursion
• to avoid infinite recursion:
 ▫ must have at least 1 base case (to terminate the
   recursive sequence)
 ▫ each recursive call must get closer to a base case
31

                                             7/20/2009




Infinite Recursive : Example
#include <stdio.h>
#include <conio.h>
void printIntegesr(int n);
main()
{      int number;
       cout<<“nEnter an integer value :”;
       cin >> number;
       printIntegers(number);                1. No condition
}                                               satatement to
void printIntegers (int nom)                    stop the
{      cout << “Value : “ << nom;              recursive call.
       printIntegers (nom);                  2. Terminal case
}                                               variable does
                                                not change.
32

                                            7/20/2009




Improved Recursive function
#include <stdio.h>
#include <conio.h>                      Exercise: Give the
                                        output if the value
void printIntegers(int n);              entered is 10 or 7.
main()
{ int number;
  cout<<“nEnter an integer value :”;
  cin >> number;
      printIntegers(number);
}                                          condition satatement
void printIntegers (int nom)               to stop the recursive
{    if (nom >= 1)                         call and the changes
       cout << “Value : “ << nom;
                                           in the terminal case
     printIntegers (nom-2);
                                           variable are
}
                                           provided.
Exercise Week 3_2
• Refer to Exercise 1 No. 3 in pg. 2.
• Solve the problem.
34

                                           7/20/2009




Conclusion and Summary
• Recursive is a repetitive process in which an
  algorithm calls itself.
• Problem that can be solved using recursive is a
  problem that can be solved by breaking the problem
  into smaller instances of problem, solve & combine
• Every recursive definition has 2 parts:
  ▫ BASE CASE: case that can be solved directly
  ▫ RECURSIVE CASE: use recursion to solve smaller
    subproblems & combine into a solution to the larger
    problem
35

                                    7/20/2009




References
1. Nor Bahiah et al. Struktur data & algoritma
   menggunakan C++. Penerbit UTM, 2005
2. Richrd F. Gilberg and Behrouz A. Forouzan,
   “Data Structures A Pseudocode Approach
   With C++”, Brooks/Cole Thomson Learning,
   2001.

C users_mpk7_app_data_local_temp_plugtmp_plugin-week3recursive

  • 1.
    1 Recursive Data Structure & Algorithm 7/20/2009 Part II Prepared by Nor Bahiah Hj Ahmad
  • 2.
    2 7/20/2009 Objectives At the end of the class students should be able to: • Identify problem solving characterestics using recursive. • Trace the implementation of recursive function. • Write recursive function in solving a problem
  • 3.
    3 7/20/2009 Introduction • Repetitive algorithm is a process wherby a sequence of operations is executed repeatedly until certain condition is achieved. • Repetition can be implemented using loop : while, for or do..while. • Besides repetition using loop, C++ allow programmers to implement recursive. • Recursive is a repetitive process in which an algorithm calls itself.
  • 4.
    4 7/20/2009 Introduction • Recursion can be used to replace loops. • Recursively defined data structures, like lists, are very well-suited to processing by recursive procedures and functions • A recursive procedure is mathematically more elegant than one using loops. • Sometimes procedures that would be tricky to write using a loop are straightforward using recursion.
  • 5.
    5 7/20/2009 Introduction • Recursive is a powerful problem solving approach, since problem solving can be expressed in an easier and neat approach. • Drawback : Execution running time for recursive function is not efficient compared to loop, since every time a recursive function calls itself, it requires multiple memory to store the internal address of the function.
  • 6.
    6 7/20/2009 Recursive solution • Not all problem can be solved using recursive. • Problem that can be solved using recursive is a problem that can be solved by breaking the problem into smaller instances of problem, solve & combine
  • 7.
    7 7/20/2009 Understanding recursion Every recursive definition has 2 parts: • BASE CASE(S): case(s) so simple that they can be solved directly • RECURSIVE CASE(S): more complex – make use of recursion to solve smaller subproblems & combine into a solution to the larger problem
  • 8.
    8 7/20/2009 Rules for Designing Recursive Algorithm 1.Determine the base case - There is one or more terminal cases whereby the problem will be solved without calling the recursive function again. 2.Determine the general case – recursive call by reducing the size of the problem 3.Combine the base case and general case into an algorithm
  • 9.
    9 7/20/2009 Designing Recursive Algorithm • Recursive algorithm. if (terminal case is reached) // base case <solve the problem> Base case and general else // general case case is < reduce the size of the problem and combined call recursive function >
  • 10.
    10 7/20/2009 Classic examples • Multiplying numbers • Find Factorial value. • Fibonacci numbers
  • 11.
    11 7/20/2009 Multiply 2 numbers using Addition Method • Multiplication of 2 numbers can be achieved by using addition method. • Example : To multiply 8 x 3, the result can also be achieved by adding value 8, 3 times as follows: 8 + 8 + 8 = 24
  • 12.
    12 7/20/2009 Implementation of Multiply() using loop int Multiply(int M,int N) { for (int i=1,i<=N,i++) result += M; return result; }//end Multiply()
  • 13.
    13 7/20/2009 Solving Multiply problem recursively Steps to solve Multiply() problem recursively: • Problem size is represented by variable N. In this example, problem size is 3. Recursive function will call Multiply() repeatedly by reducing N by 1 for each respective call. • Terminal case is achieved when the value of N is 1 and recursive call will stop. At this moment, the solution for the terminal case will be computed and the result is returned to the called function. • The simple solution for this example is represented by variable M. In this example, the value of M is 8.
  • 14.
    14 7/20/2009 Implementation of recursive function: Multiply() int Multiply (int M,int N) { if (N==1) return M; else return M + Multiply(M,N-1); }//end Multiply()
  • 15.
    15 7/20/2009 Recursive algorithm 3 important factors for recursive implementation: • There’s a condition where the function will stop calling itself. (if this condition is not fulfilled, infinite loop will occur) • Each recursive function call, must return to the called function. • Variable used as condition to stop the recursive call must change towards terminal case.
  • 16.
    16 7/20/2009 Tracing Recursive Implementation for Multiply().
  • 17.
    17 Returning the Multiply()result to the 7/20/2009 called function
  • 18.
    Exercise Week 3_1 •Refer to Exercise 1 No. 2 in pg. 2. • Solve the problem.
  • 19.
    19 7/20/2009 Factorial Problem • Problem : Get Factorial value for a positive integer number. • Solution : The factorial value can be achieved as follows: 0! is equal to 1 1! is equal to 1 x 0! = 1 x 1 = 1 2! is equal to 2 x 1! = 2 x 1 x 1 = 2 3! is equal to 3 x 2! = 3 x 2 x 1 x 1 = 6 4! is equal to 4 x 3! = 4 x 3 x 2 x 1 x 1 = 24 N! is equal to N x (N-1)! For every N>0
  • 20.
    20 7/20/2009 Solving Factorial Recursively 1. The simple solution for this example is represented by the factorial value equal to 1. 2. N, represent the factorial size. The recursive process will call factorial() function recursively by reducing N by 1. 3. Terminal case for factorial problem is when N equal to 0. The computed result is returned to called function.
  • 21.
    21 7/20/2009 Factorial function Here’s a function that computes the factorial of a number N without using a loop. • It checks whether N is equal 0. If so, the function just return 1. • Otherwise, it computes the factorial of (N – 1) and multiplies it by N. int Factorial (int N ) { /*start Factorial*/ if (N==0) return 1; else return N * Factorial (N-1); } /*end Factorial
  • 22.
    22 7/20/2009 Execution of Factorial(3)
  • 23.
    23 7/20/2009 Terminal case for Factorial(3)
  • 24.
    24 7/20/2009 Return value for Factorial(3)
  • 25.
    25 7/20/2009 Fibonacci Problem • Problem : Get Fibonacci series for an integer positive. • Fibonacci Siries : 0, 1, 1, 2, 3, 5, 8, 13, 21,….. • Starting from 0 and and have features that every Fibonacci series ia the result of adding 2 previous Fibonacci numbers. • Solution: Fibonacci value of a number can be computed as follows: Fibonacci ( 0) = 0 Fibonacci ( 1) = 1 Fibonacci ( 2) = 1 Fibonacci ( 3) = 2 Fibonacci ( N) = Fibonacci (N-1) + Fibonacci (N-2)
  • 26.
    26 7/20/2009 Solving Fibonacci Recursively 1. The simple solution for this example is represented by the Fibonacci value equal to 1. 2. N, represent the series in the Fibonacci number. The recursive process will integrate the call of two Fibonacci () function. 3. Terminal case for Fibonacci problem is when N equal to 0 or N equal to 1. The computed result is returned to the called function.
  • 27.
    27 7/20/2009 Fibonacci() function int Fibonacci (int N ) { /* start Fibonacci*/ if (N<=0) return 0; else if (N==1) return 1; else return Fibonacci(N-1) + Fibonacci (N-2); }
  • 28.
    28 7/20/2009 Implementation of Fibonacci() : passing and returning value from function.
  • 29.
    Exercise Week 3_1 •Refer to Exercise 1 No. 4.iii. in pg. 4. • Solve the problem. • Refer to Exercise 2 No. 1 in pg. 4. • Solve the problem.
  • 30.
    30 7/20/2009 Infinite Recursive • Avoiding infinite(?) recursion • to avoid infinite recursion: ▫ must have at least 1 base case (to terminate the recursive sequence) ▫ each recursive call must get closer to a base case
  • 31.
    31 7/20/2009 Infinite Recursive : Example #include <stdio.h> #include <conio.h> void printIntegesr(int n); main() { int number; cout<<“nEnter an integer value :”; cin >> number; printIntegers(number); 1. No condition } satatement to void printIntegers (int nom) stop the { cout << “Value : “ << nom; recursive call. printIntegers (nom); 2. Terminal case } variable does not change.
  • 32.
    32 7/20/2009 Improved Recursive function #include <stdio.h> #include <conio.h> Exercise: Give the output if the value void printIntegers(int n); entered is 10 or 7. main() { int number; cout<<“nEnter an integer value :”; cin >> number; printIntegers(number); } condition satatement void printIntegers (int nom) to stop the recursive { if (nom >= 1) call and the changes cout << “Value : “ << nom; in the terminal case printIntegers (nom-2); variable are } provided.
  • 33.
    Exercise Week 3_2 •Refer to Exercise 1 No. 3 in pg. 2. • Solve the problem.
  • 34.
    34 7/20/2009 Conclusion and Summary • Recursive is a repetitive process in which an algorithm calls itself. • Problem that can be solved using recursive is a problem that can be solved by breaking the problem into smaller instances of problem, solve & combine • Every recursive definition has 2 parts: ▫ BASE CASE: case that can be solved directly ▫ RECURSIVE CASE: use recursion to solve smaller subproblems & combine into a solution to the larger problem
  • 35.
    35 7/20/2009 References 1. Nor Bahiah et al. Struktur data & algoritma menggunakan C++. Penerbit UTM, 2005 2. Richrd F. Gilberg and Behrouz A. Forouzan, “Data Structures A Pseudocode Approach With C++”, Brooks/Cole Thomson Learning, 2001.