Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Question about recursion

Question about recursion

Scheduled Pinned Locked Moved C / C++ / MFC
tutorialquestion
7 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E Offline
    E Offline
    ericelysia
    wrote on last edited by
    #1

    Hello, I am trying to understand recursion by using the following example. #include #include using namespace std; unsigned long factorial( unsigned long ); // function prototype //------------------------------------------------------------------------- int main() { // Loop 4 times. During each iteration, calculate factorial( i ) and display result. for ( int i = 0; i <= 4; i++ ) { cout << "\n i = " << i << endl; cout << endl << setw( 2 ) << i << "! = " << factorial( i ) << endl; } return 0; // indicates successful termination } // end main //------------------------------------------------------------------------- // recursive definition of function factorial unsigned long factorial( unsigned long number ) { // base case if ( number <= 1 ) { return 1; } // recursive step else { cout << endl << "number = " << number << " factorial(number - 1) = " << factorial(number - 1) << " number * factorial(number - 1) = " << number * factorial( number - 1 ) << endl; return number * factorial( number - 1 ); } } // end function factorial //------------------------------------------------------------------------- /* output: i = 0 0! = 1 i = 1 1! = 1 i = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 2! = 2 i = 3 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 3! = 6 i = 4 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 4 factorial(number - 1) = 6 number * factorial(number - 1) = 24 number = 2 factorial(number - 1) =

    M D J E 4 Replies Last reply
    0
    • E ericelysia

      Hello, I am trying to understand recursion by using the following example. #include #include using namespace std; unsigned long factorial( unsigned long ); // function prototype //------------------------------------------------------------------------- int main() { // Loop 4 times. During each iteration, calculate factorial( i ) and display result. for ( int i = 0; i <= 4; i++ ) { cout << "\n i = " << i << endl; cout << endl << setw( 2 ) << i << "! = " << factorial( i ) << endl; } return 0; // indicates successful termination } // end main //------------------------------------------------------------------------- // recursive definition of function factorial unsigned long factorial( unsigned long number ) { // base case if ( number <= 1 ) { return 1; } // recursive step else { cout << endl << "number = " << number << " factorial(number - 1) = " << factorial(number - 1) << " number * factorial(number - 1) = " << number * factorial( number - 1 ) << endl; return number * factorial( number - 1 ); } } // end function factorial //------------------------------------------------------------------------- /* output: i = 0 0! = 1 i = 1 1! = 1 i = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 2! = 2 i = 3 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 3! = 6 i = 4 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 4 factorial(number - 1) = 6 number * factorial(number - 1) = 24 number = 2 factorial(number - 1) =

      M Offline
      M Offline
      Michael Dunn
      wrote on last edited by
      #2

      The recursive calls have to complete before the output can be sent to cout. So what you're seeing is the output from the deepest recursive call first. --Mike-- Visual C++ MVP :cool: LINKS~! Ericahist | NEW!! PimpFish | CP SearchBar v3.0 | C++ Forum FAQ

      E 1 Reply Last reply
      0
      • M Michael Dunn

        The recursive calls have to complete before the output can be sent to cout. So what you're seeing is the output from the deepest recursive call first. --Mike-- Visual C++ MVP :cool: LINKS~! Ericahist | NEW!! PimpFish | CP SearchBar v3.0 | C++ Forum FAQ

        E Offline
        E Offline
        ericelysia
        wrote on last edited by
        #3

        Hasn't the output already been sent to cout? The program already output 2! = 2 and i = 3. At the point in the program where i = 3 is output, doesn't that signify the beginning of a new iteration? Thanks, Eric

        E 1 Reply Last reply
        0
        • E ericelysia

          Hasn't the output already been sent to cout? The program already output 2! = 2 and i = 3. At the point in the program where i = 3 is output, doesn't that signify the beginning of a new iteration? Thanks, Eric

          E Offline
          E Offline
          ericelysia
          wrote on last edited by
          #4

          OK, I still don't get it. I changed the code a little to make the invocations easier to see. #include #include using namespace std; unsigned long factorial( unsigned long ); // function prototype //------------------------------------------------------------------------- int count = 0; int main() { // Loop 2 times. During each iteration, calculate factorial( i ) and display result. for ( int i = 0; i <= 2; i++ ) { cout << "\n i = " << i << endl; cout << endl << setw( 2 ) << i << "! = " << factorial( i ) << endl; cout << endl << "--------------------------------------------" << endl; } return 0; // indicates successful termination } // end main //------------------------------------------------------------------------- // recursive definition of function factorial unsigned long factorial( unsigned long number ) { count++; cout << endl << "factorial was invoked for the " << count << " time " << " number = " << number << endl; // base case if ( number <= 1 ) { cout << endl << "number <= 1" << endl; return 1; } // recursive step else { cout << endl << "number = " << number << " factorial(number - 1) = " << factorial(number - 1) << " " << number << " * " << factorial( number - 1 ) << " = " << number * factorial( number - 1 ) << endl; return number * factorial( number - 1 ); } } // end function factorial //------------------------------------------------------------------------- OUTPUT: i = 0 factorial was invoked for the 1 time number = 0 number <= 1 0! = 1 -------------------------------------------- i = 1 factorial was invoked for the 2 time number = 1 number <= 1 1! = 1 -------------------------------------------- i = 2 factorial was invoked for the 3 time number = 2 factorial was invoked for the 4 time number = 1 number <= 1 factorial was invoked for the 5 time number = 1 number <= 1 factorial was invoked for the 6 time number = 1 number <= 1 number = 2 factorial(number - 1) = 1 2 * 1 = 2 factorial was invoked for the 7 time number = 1 number <= 1 2! = 2 -------------------------------------------- Press any key to continue */ Please walk me through the following: i = 2 factorial was invoked for the 3 time number = 2 factorial was invoked for th

          1 Reply Last reply
          0
          • E ericelysia

            Hello, I am trying to understand recursion by using the following example. #include #include using namespace std; unsigned long factorial( unsigned long ); // function prototype //------------------------------------------------------------------------- int main() { // Loop 4 times. During each iteration, calculate factorial( i ) and display result. for ( int i = 0; i <= 4; i++ ) { cout << "\n i = " << i << endl; cout << endl << setw( 2 ) << i << "! = " << factorial( i ) << endl; } return 0; // indicates successful termination } // end main //------------------------------------------------------------------------- // recursive definition of function factorial unsigned long factorial( unsigned long number ) { // base case if ( number <= 1 ) { return 1; } // recursive step else { cout << endl << "number = " << number << " factorial(number - 1) = " << factorial(number - 1) << " number * factorial(number - 1) = " << number * factorial( number - 1 ) << endl; return number * factorial( number - 1 ); } } // end function factorial //------------------------------------------------------------------------- /* output: i = 0 0! = 1 i = 1 1! = 1 i = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 2! = 2 i = 3 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 3! = 6 i = 4 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 4 factorial(number - 1) = 6 number * factorial(number - 1) = 24 number = 2 factorial(number - 1) =

            D Offline
            D Offline
            David Crow
            wrote on last edited by
            #5

            It appears that you are calling factorial() three times within itself (one for the algorithm itself, and two for the cout statements). With all of those cout statements, that may be leading to the confusion.


            "The greatest good you can do for another is not just to share your riches but to reveal to him his own." - Benjamin Disraeli

            1 Reply Last reply
            0
            • E ericelysia

              Hello, I am trying to understand recursion by using the following example. #include #include using namespace std; unsigned long factorial( unsigned long ); // function prototype //------------------------------------------------------------------------- int main() { // Loop 4 times. During each iteration, calculate factorial( i ) and display result. for ( int i = 0; i <= 4; i++ ) { cout << "\n i = " << i << endl; cout << endl << setw( 2 ) << i << "! = " << factorial( i ) << endl; } return 0; // indicates successful termination } // end main //------------------------------------------------------------------------- // recursive definition of function factorial unsigned long factorial( unsigned long number ) { // base case if ( number <= 1 ) { return 1; } // recursive step else { cout << endl << "number = " << number << " factorial(number - 1) = " << factorial(number - 1) << " number * factorial(number - 1) = " << number * factorial( number - 1 ) << endl; return number * factorial( number - 1 ); } } // end function factorial //------------------------------------------------------------------------- /* output: i = 0 0! = 1 i = 1 1! = 1 i = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 2! = 2 i = 3 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 3! = 6 i = 4 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 4 factorial(number - 1) = 6 number * factorial(number - 1) = 24 number = 2 factorial(number - 1) =

              J Offline
              J Offline
              Jeremy Thornton
              wrote on last edited by
              #6

              If you are trying to track the stages of recursion with the cout line then I suggest that you minimise your confusion by calling your recursive function just ONCE and storing the result to use in your cout line and to return, I think that this will you help dissect what is going on? Good luck I´m sure it will just click and you will go "Ah!":)

              1 Reply Last reply
              0
              • E ericelysia

                Hello, I am trying to understand recursion by using the following example. #include #include using namespace std; unsigned long factorial( unsigned long ); // function prototype //------------------------------------------------------------------------- int main() { // Loop 4 times. During each iteration, calculate factorial( i ) and display result. for ( int i = 0; i <= 4; i++ ) { cout << "\n i = " << i << endl; cout << endl << setw( 2 ) << i << "! = " << factorial( i ) << endl; } return 0; // indicates successful termination } // end main //------------------------------------------------------------------------- // recursive definition of function factorial unsigned long factorial( unsigned long number ) { // base case if ( number <= 1 ) { return 1; } // recursive step else { cout << endl << "number = " << number << " factorial(number - 1) = " << factorial(number - 1) << " number * factorial(number - 1) = " << number * factorial( number - 1 ) << endl; return number * factorial( number - 1 ); } } // end function factorial //------------------------------------------------------------------------- /* output: i = 0 0! = 1 i = 1 1! = 1 i = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 2! = 2 i = 3 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 3! = 6 i = 4 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 3 factorial(number - 1) = 2 number * factorial(number - 1) = 6 number = 2 factorial(number - 1) = 1 number * factorial(number - 1) = 2 number = 4 factorial(number - 1) = 6 number * factorial(number - 1) = 24 number = 2 factorial(number - 1) =

                E Offline
                E Offline
                ericelysia
                wrote on last edited by
                #7

                OK, thanks to all of the great feedback, I have a better understanding about recursion. I am now attempting to apply it and I have come across a problem that I can't seem to pinpoint. I have written the "eight queens" program, but for some reason, I get an infinite loop. I think my base case is ok. Can someone help me figure out what I am doing wrong here? Thanks in advance, Eric #include using namespace std; const int BOARD_SIZE = 8; // function prototypes void fillBoard( int [], int, int ); bool noConflict( int [], int, int ); void printBoard( int [], int ); //-------------------------------------------------------------- // main method int main() { int chessboard[ BOARD_SIZE ]; // represents a chessboard with 8 rows (0-7) int column = 0; int count = 0; // keeps track of the count fillBoard( chessboard, column, count ); // invokes fillBoard function to start filling the chessboard return 0; // indicates sucessful termination } // end main method //-------------------------------------------------------------- // fillBoard method void fillBoard( int board[ BOARD_SIZE ], int c, int cnt ) { for( int r = 0; r <= 7; r ++ ) // for every row on the board { board[ c ] = r; // assign the value of row to the column if( noConflict( board, r, c ) ) // if there is not a conflicting queen { if( c == 7 ) // if it is the last column { printBoard( board, cnt); // output the board } else { fillBoard( board, c + 1, cnt ); // else recursively invoke fillBoard for the next column } } } } // end fillBoard method //-------------------------------------------------------------- // noConflict method bool noConflict( int board[ BOARD_SIZE ], int r, int c ) { for( int col = c - 1; col >= 0; col-- ) // for each column on the board { if( board[ col ] == r // checks horizontally to the left || board[ col ] == r + c - col // checks diagonally moving down and to the left || board[ col ] == r + col - c ) // checks diagonally moving up and to the left { return false; // there is a conflict } else { return true; // there is not a conflict } } return true; // there is not a conflict } // end noConflict method //------------------------------------------------------------- // printBoard method void printBoard( int board [ BOARD_SIZE ], int cnt ) { cout << "Count = " << ++cnt << endl; // output the count for( int r

                1 Reply Last reply
                0
                Reply
                • Reply as topic
                Log in to reply
                • Oldest to Newest
                • Newest to Oldest
                • Most Votes


                • Login

                • Don't have an account? Register

                • Login or register to search.
                • First post
                  Last post
                0
                • Categories
                • Recent
                • Tags
                • Popular
                • World
                • Users
                • Groups