麻烦将嵌套循环实现为递归解决方案

时间:2015-08-03 17:39:49

标签: c++ recursion

非递归代码

以下是我尝试转换为递归解决方案的代码。

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

3 个答案:

答案 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)

您可以将xyz替换为您喜欢的内容,并修改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;
    }
}

Live Example

递归方法将成为:

void print(int i)
{

    cout << setw(3) << setfill('0') << i << "\n";
    if (i == 949)
        return;
    if (((i+1) % 50) == 0)
        i += 50;
    print(++i);
}

Live Example