Need help with a recursive function

Hello,

I have an assignment coming up in which we are supposed to input a value and then convert it into another value by multiplying it with a conversion factor/multiplier. The inputs are the units of the input value and converted value, the conversion factor, the value to start with, the increments and the amount of increments to generate. Once it has been generated, it needs to be displayed in a table like the one below.

Inches Centimetres| Inches Centimetres
1.00 2.5400000 | 2.00 5.0800000
3.00 7.6200000 | 4.00 10.1600000
5.00 12.7000000 | 6.00 15.2400000
7.00 17.7800000 | 8.00 20.3200000
9.00 22.8600000 | 10.00 25.4000000

Displaying this table seems pretty straightforward however we are told to try using recursive functions to try and display the converted values. I can't seem to do that part. Any ideas? I made part of the code but the actual value calculation using recursive functions seems confusing. Any ideas?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
#include <cmath>
#include <iostream>
#include <string>
#include <iomanip>
#include <ctype.h>

using namespace std;

string originalUnit; //Name of original measurement unit
string convertedUnit; //Name of converted measurement unit
float convFactor = 0; //Conversion factor/multiplier
float startValue = 0; //Starting value of conversion table
float increment = 0; //Increment from one original measurement value to the next
int noOfvalues = 0; //Number of original measurement values to be generated

float x = 0;

float calculation(int, float, float) ;

int main()
{
	cout << "Unit Conversion Table Generator\n\n";
	for(;;)
	{
		do
		{
			cout << "Enter name of the original measurement unit (e.g. inches): ";
			cin >> originalUnit;
			if (isalpha(originalUnit[0]))
			{
				cout << originalUnit << "\n";
			}
			else
			{
				cout << "ERROR: Value must start with an alphabet character. Please try again.\n";
			}
		} while (!isalpha(originalUnit[0]));

		do
		{
			cout << "Enter name of the converted measurement unit (e.g. centimetres): ";
			cin >> convertedUnit;
			if (isalpha(convertedUnit[0]))
			{
				cout << convertedUnit << "\n";
			}
			else
			{
				cout << "ERROR: Value must start with an alphabet character. Please try again.\n";
			}
		} while (!isalpha(convertedUnit[0]));

		cout << "Enter conversion factor / multiplier (e.g. 2.54): ";
		cin >> convFactor;

		cout << "Enter the starting value of the conversion table for the original measurement unit: ";
		cin >> startValue;

		cout << "Enter the increment from one original measurement value to the next: ";
		cin >> increment;

		do
		{
		cout << "Enter the number of original measurement values to be generated: ";
		cin >> noOfvalues;
			if (noOfvalues > -1)
			{
				cout << noOfvalues << "\n\n";
			}
			else if (noOfvalues < 0)
			{
				cout << "ERROR: Value must be positive.\n";
			}
		} while (noOfvalues < 0);

		cout << originalUnit << " to " << convertedUnit << " Unit Conversion Table\n\n";

		cout << " " << setw(7) << left << originalUnit << setw(15) << left << convertedUnit << "|"; 
		cout << " " << setw(7) << left << originalUnit << setw(15) << left << convertedUnit << "\n";

		cout << " " << setw(7) << left << startValue << setw(15) << left << startValue*convFactor << "|";
		cout << " " << setw(7) << left << startValue + increment << setw(15) << left << (startValue + increment)*convFactor << "\n";
		
		calculation(noOfvalues, startValue, increment);


		
		system("pause");
		}
}



float calculation(int b /*noOfvalues*/, float a /*startValue*/, float c /*increment*/)
{
	if (x <= b*a)
	{
		cout << "Value to convert: " << x << endl;
		calculation(b, a, c + x);
	}
return 0;
}#include <cmath>
#include <iostream>
#include <string>
#include <iomanip>
#include <ctype.h>

using namespace std;

string originalUnit; //Name of original measurement unit
string convertedUnit; //Name of converted measurement unit
float convFactor = 0; //Conversion factor/multiplier
float startValue = 0; //Starting value of conversion table
float increment = 0; //Increment from one original measurement value to the next
int noOfvalues = 0; //Number of original measurement values to be generated

float x = 0;

float calculation(int, float, float) ;

int main()
{
	cout << "Unit Conversion Table Generator\n\n";
	for(;;)
	{
		do
		{
			cout << "Enter name of the original measurement unit (e.g. inches): ";
			cin >> originalUnit;
			if (isalpha(originalUnit[0]))
			{
				cout << originalUnit << "\n";
			}
			else
			{
				cout << "ERROR: Value must start with an alphabet character. Please try again.\n";
			}
		} while (!isalpha(originalUnit[0]));

		do
		{
			cout << "Enter name of the converted measurement unit (e.g. centimetres): ";
			cin >> convertedUnit;
			if (isalpha(convertedUnit[0]))
			{
				cout << convertedUnit << "\n";
			}
			else
			{
				cout << "ERROR: Value must start with an alphabet character. Please try again.\n";
			}
		} while (!isalpha(convertedUnit[0]));

		cout << "Enter conversion factor / multiplier (e.g. 2.54): ";
		cin >> convFactor;

		cout << "Enter the starting value of the conversion table for the original measurement unit: ";
		cin >> startValue;

		cout << "Enter the increment from one original measurement value to the next: ";
		cin >> increment;

		do
		{
		cout << "Enter the number of original measurement values to be generated: ";
		cin >> noOfvalues;
			if (noOfvalues > -1)
			{
				cout << noOfvalues << "\n\n";
			}
			else if (noOfvalues < 0)
			{
				cout << "ERROR: Value must be positive.\n";
			}
		} while (noOfvalues < 0);

		cout << originalUnit << " to " << convertedUnit << " Unit Conversion Table\n\n";

		cout << " " << setw(7) << left << originalUnit << setw(15) << left << convertedUnit << "|"; 
		cout << " " << setw(7) << left << originalUnit << setw(15) << left << convertedUnit << "\n";

		cout << " " << setw(7) << left << startValue << setw(15) << left << startValue*convFactor << "|";
		cout << " " << setw(7) << left << startValue + increment << setw(15) << left << (startValue + increment)*convFactor << "\n";
		
		calculation(noOfvalues, startValue, increment);


		
		system("pause");
		}
}



float calculation(int b /*noOfvalues*/, float a /*startValue*/, float c /*increment*/)
{
	if (x <= b*a)
	{
		cout << "Value to convert: " << x << endl;
		calculation(b, a, c + x);
	}
return 0;
}
Last edited on
A recursive function is one that calls itself. You seem to have that down. However a recursive function can only return one value to main. You could using some sort of container but your assignment wants you to use a recursive function to display a table, not return a bunch of values to convert(from my understanding of your explanation anyways).

I've changed your program around a bit to use a recursive function that prints the table. Please do not use global variables, you may want to have a look at static variables[0].


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#include <cmath>
#include <iostream>
#include <string>
#include <iomanip>
#include <ctype.h>

using namespace std;

void printTable(const int &, float, const float &, const float &);

// Don't use global variables, when required use static variables

int main()
{
	/// MOVED VARIABLES
	string originalUnit; //Name of original measurement unit
	string convertedUnit; //Name of converted measurement unit
	float convFactor = 0; //Conversion factor/multiplier
	float startValue = 0; //Starting value of conversion table
	float increment = 0; //Increment from one original measurement value to the next
	int noOfvalues = 0; //Number of original measurement values to be generated
	
	cout << "Unit Conversion Table Generator\n\n";
	for(;;)
	{
		do
		{
			cout << "Enter name of the original measurement unit (e.g. inches): ";
			cin >> originalUnit;
			if (isalpha(originalUnit[0]))
			{
				cout << originalUnit << "\n";
			}
			else
			{
				cout << "ERROR: Value must start with an alphabet character. Please try again.\n";
			}
		} while (!isalpha(originalUnit[0]));

		do
		{
			cout << "Enter name of the converted measurement unit (e.g. centimetres): ";
			cin >> convertedUnit;
			if (isalpha(convertedUnit[0]))
			{
				cout << convertedUnit << "\n";
			}
			else
			{
				cout << "ERROR: Value must start with an alphabet character. Please try again.\n";
			}
		} while (!isalpha(convertedUnit[0]));

		cout << "Enter conversion factor / multiplier (e.g. 2.54): ";
		cin >> convFactor;

		cout << "Enter the starting value of the conversion table for the original measurement unit: ";
		cin >> startValue;

		cout << "Enter the increment from one original measurement value to the next: ";
		cin >> increment;

		do
		{
		        cout << "Enter the number of original measurement values to be generated: ";
		        cin >> noOfvalues;
			if (noOfvalues > -1)
			{
				cout << noOfvalues << "\n\n";
			}
			else if (noOfvalues < 0)
			{
				cout << "ERROR: Value must be positive.\n";
			}
		} while (noOfvalues < 0);

		cout << originalUnit << " to " << convertedUnit << " Unit Conversion Table\n\n";

		cout << " " << setw(7) << left << originalUnit << setw(15) << left << convertedUnit << "|"; 
		cout << " " << setw(7) << left << originalUnit << setw(15) << left << convertedUnit << "\n";

		printTable(noOfvalues, startValue, increment, convFactor);


		system("pause");
	}
}


// use appropriate parameter names, that's what they're for
void printTable(const int &valuesToGen, float valToConv, const float &incr, const float &convFactor)
{
	if (valuesToGen > 1) { // make sure we have two values to print
		cout << " " << setw(7) << left << valToConv << setw(15) << left << valToConv*convFactor;
		
        if (valuesToGen % 2 == 0) // if even
            std::cout << endl;
        else                      // if odd
            std::cout << "|";

        printTable(valuesToGen - 1, valToConv + incr, incr, convFactor);  // CALLS ITSELF
	} else if (valuesToGen == 1)
		cout << " " << setw(7) << left << valToConv << setw(15) << left << valToConv*convFactor << "|" << endl;
	

}


[0]http://www.learncpp.com/cpp-tutorial/811-static-member-variables/
Last edited on
@ChajusSaib thank you so much! I will try compiling this.
Looks like you've got an error over and that's why it won't compile. Watch out with those errors as they can be very hard to be detected sometimes. If you need help detecting those you can try using a programs to help you, such as chrckmarx which works fine I think.
Anyway, good luck!
Ben.
Topic archived. No new replies allowed.