Recursive Function Help (pls) pt 2

G

Guest

OK:
Purpose: Using user's input and 3 recursive functions, construct an hour
glass figure. Main can only have user input, loops and function calls.
Recursive function 1 takes input and displays a sequence of spaces;
recursive function 2 uses input to display ascending sequence of digits;
likewise, recursive function 3 uses input to display descending sequence of
digits.

I have not followed the instructions completely regarding the digits, but I
feel I'm close - I'm looking for suggestions for the spacing issue - I'm
baffled there. The following in the output from my program:
Enter an integer between 1 and 9 : 4
012343210012343210
01232100123210
0121001210
0101010
1Press any key to continue

It should display
012343210012343210
01232100123210
0121001210
010010
00
00
010010
0121001210
01232100123210
012343210012343210
Here's my code:

#include <iostream>
#include <string>
using namespace std;
void Spacing (int);
void Ascending (int, int);
void Descending (int);
// Main can only have the function calls and loops
int main()
{
cout <<"Enter an integer between 1 and 9 : ";
int Value;
cin >> Value;

int count = 0;
while (Value > count)
{
Ascending (0, Value);
Spacing (Value);
Ascending (0, Value);
cout <<endl;
Spacing (Value);
// Descending (Value);
--Value;
}

return 0;
}
// This recursive function takes user input and displays given number of
spaces
void Spacing (int n)
{
char c = ' ';
string space = "";
int i = n;
n = n - (i - 1);
while (i <= n)
{
cout<<n;
++i;
}
}
/* This was an experiment for Function descending
string Reverse (int Number)
{
string s = "";
string c;
for(int bit; Number != 0;)
{
bit = Number % 2;
Number = Number / 2;
c = char ('0' + bit);
s = s + c;
}
cout <<s<<endl<<endl;
return s;
}
*/
// This recursive function is supposed to only take the user
// input and display each digit from 0 - number -
// It's currently displaying all my digits (I'm working on it)
void Ascending (int current, int stopval)
{
cout <<current;
if (current < stopval)
{
Ascending(current + 1, stopval);
cout << current;
}
}
// Again, this will be the recursive descending fuction
// used only to display input number - 0.
/*void Descending (int descend)
{
while (descend >= 0)
{
cout <<descend;
descend--;
}
cout << endl;
}
*/
 
K

Karl Heinz Buchegger

OK:
Purpose: Using user's input and 3 recursive functions, construct an hour
glass figure. Main can only have user input, loops and function calls.
Recursive function 1 takes input and displays a sequence of spaces;
recursive function 2 uses input to display ascending sequence of digits;
likewise, recursive function 3 uses input to display descending sequence of
digits.

May I suggest you forget the hourglass at the moment and simply concentrate
on the individual pieces. It's much simpler that way.

OK. Your assignment is to write a function (which must be recusive) to output
a given number of spaces.

The goal is: output a given number of spaces.
Q: When is this goal extremely simple to reach?
A: If the number of spaces to output equals 0. Because then the
function has to do nothing.

So lets start writing the function with what we know up to now:

void Spacing( int n )
{
if( n == 0 )
return;

Q: What about other numbers?
A: Those cases are much to hard for us, thus we take a lazy approach:
If the goal is to output n spaces, let us output 1 space and let us
call a function which outputs the remaining n-1 spaces.
Q: But which function should we call?
A: Well, there is function Spacing. This function claims to be able to
output n spaces, thus it must be simple for this function to output
n-1 spaces.

void Spacing( int n )
{
if( n == 0 )
return;

cout << " ";
Spacing( n-1 );
}


Q: That's it?
A: That's it!
See. In the recursive call there is always 1 subtracted from n.
So if we start out with a value of lets say 5 for n, what happens.
5 doesn't equal 0, thus the if is not taken.
1 space gets sent to cout, then function Spacing is called with an
argument of 5 - 1 -> 4. That function does:
send 1 space to cout
call function Spaceing with an Argument of 4 - 1 -> 3. That function does:
send 1 space to cout
call function Spaceing with an Arg. of 3 - 1 -> 2. That function does:
send 1 space to cout
call function Spacing with an Arg. of 2 - 1 -> 1. That function does:
send 1 space to cout
call function Spaceing with an Arg. of 1 - 1 -> 0. That function does:
the first if detects that the passed argument happens to be 0, thus
it simply returns
function returns
function returns
function returns
function returns
function returns

and the program returns to the called which called Spacing( 5 ). Now count
how many spaces have been sent to cout. They are exactly 5. Each invocation
of Spacing, with the exception of the last one, has output exactly 1 space.

The trick is the subtraction. By always subtracting 1, we make the number of
spaces to output smaller and smaller until we finaly hit 0. And this is our
simple case, we know how to deal with that: do nothing.
 
D

Dan W.

I'm sure you'll be able to extend Karl's tutorial to the other
functions. Each time the function calls itself again, it is not the
same n, I hope you understand; even though it has the same name. If
you have too much trouble, just tell us.

Much nicer code, by the way. :)
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,482
Members
44,901
Latest member
Noble71S45

Latest Threads

Top