非递归代码
以下是我尝试转换为递归解决方案的代码。
int main()
{
int number[3];
for (number[0]=0; number[0] <= 9; number[0]++)
{
for (number[1]=0; number[1] <= 4; number[1]++)
{
for (number[2]=0; number[2] <= 9; number[2]++)
{
std::cout << number[0] << number[1] << number[2] << std::endl;
}
}
}
std::cout << "Press any key to continue";
std::cin.ignore();
return 0;
}
此代码的输出可在http://pastebin.com/f20X3gT3找到。
递归尝试
这是我将上述算法复制到递归解决方案的失败尝试。它编译没有任何错误,但它没有给出与上述非递归解决方案相同的结果。
#include <iostream>
const int NumberLength = 3;
int number[3];
int element;
void generateFormula(const int Length) {
if(Length == 0) {
for (int n = 0; n <= NumberLength; ++n) {
std::cout << number[n];
}
std::cout << std::endl;
return;
}
if(element%2==0) {
for(number[element]=0; number[element] <= 9; number[element]++);
generateFormula(Length-1);
}
else {
for(number[element]=0; number[element] <= 4; number[element]++);
generateFormula(Length-1);
}
element++;
}
int main()
{
for (int i = 0; i <= NumberLength; ++i)
generateFormula(i);
std::cout << "Press any key to continue";
std::cin.ignore();
return 0;
}
输出:
0000
10000
10501
10500
答案 0 :(得分:1)
如果你稍微改变一下你的功能,你将能够看到如何将它转换为递归函数。
// Drive it using externally supplied data.
void generateFormula1(int number[], int loopCounter[])
{
for (; number[0] <= loopCounter[0]; number[0]++)
{
for (; number[1] <= loopCounter[1]; number[1]++)
{
for (; number[2] <= loopCounter[2]; number[2]++)
{
std::cout << number[0] << number[1] << number[2] << std::endl;
}
}
}
}
现在,将它转换为递归函数会更容易一些。
void generateFormula2(int number[], int loopCounter[], int nestingLevel)
{
// The terminating condition of the recursive function.
if ( nestingLevel == 3 )
{
std::cout << number[0] << number[1] << number[2] << std::endl;
return;
}
for (; number[nestingLevel] <= loopCounter[nestingLevel]; number[nestingLevel]++)
{
generateFormula2(number, loopCounter, nestingLevel+1);
}
}
使用以下方法测试:
int main()
{
int loopCounter[3] = {9, 4, 9};
int number1[3] = {0};
generateFormula1(number1, loopCounter);
int number2[3] = {0};
generateFormula2(number2, loopCounter, 0);
return 0;
}
在http://ideone.com/JH76sa处查看它。
答案 1 :(得分:0)
void print(int x, int y, int z){
std::cout << '(' << x << ", " << y << ", " << z << ")\n";
++x;
if(x == 10){
x = 0;
++y;
if(y == 10){
y = 0;
++z;
if(z == 10)
return;
}
}
print(x, y, z);
}
auto main() -> int{
print(0, 0, 0);
}
这将打印出(0, 0, 0)
到(9, 9, 9)
您可以将x
,y
和z
替换为您喜欢的内容,并修改if
语句的参数以获得所需的结果。您还可以概括函数以获得每个参数的限制:
template<int XLim, int YLim, int ZLim>
void print(int x, int y, int z){
std::cout << '(' << x << ", " << y << ", " << z << ")\n";
if(z >= ZLim && y >= YLim && z >= ZLim) return;
++x;
if(x == 10){
x = 0;
++y;
if(y == 10){
y = 0;
++z;
if(z == 10) return;
}
}
print<XLim, YLim, ZLim>(x, y, z);
}
auto main() -> int{
print<9, 4, 9>(0, 0, 0);
}
答案 2 :(得分:0)
你可以简化你的功能。使用std::setw()
和std::setfill()
您不需要有三个不同的变量。您可以将迭代方法更改为
void print()
{
for (int i = 0; i < 950; i++)
{
cout << setw(3) << setfill('0') << i << "\n";
if (((i+1) % 50) == 0)
i += 50;
}
}
递归方法将成为:
void print(int i)
{
cout << setw(3) << setfill('0') << i << "\n";
if (i == 949)
return;
if (((i+1) % 50) == 0)
i += 50;
print(++i);
}