使用递归打印部分编号

时间:2016-10-26 02:22:13

标签: c++ recursion

我有一个函数void numbers(ostream& outs, const string& prefix, unsigned int levels);,可以将输出打印到ostream出口。

输出包含字符串前缀,后跟1.1。,1.2。,1.3。等形式的“section numbers”。 levels参数确定节号码的级别。例如,如果级别为2,则节号的格式为x.y.如果级别为3,则节号的格式为x.y.z.每个级别允许的数字始终为“1”到“9”。例如,如果前缀是字符串“THERBLIG”且级别为2,则该函数将通过打印开始:

  

THERBLIG1.1。

     

THERBLIG1.2。

     

THERBLIG1.3。

     

并以打印结束:

     

THERBLIG9.7。

     

THERBLIG9.8。

     

THERBLIG9.9。

当等级达到零时发生停止案例(在这种情况下,前缀自己打印一次,然后没有其他内容)。

我的当前代码在level为2时正确打印出所有部分,但是当level为3时则不然。如何使我的代码更具动态性和通用性,以便它可以将任何数字作为级别? (当等级为3时,输出应为1.1.1,1.1.2,1.1.3 ...... 1.2.1 ..)。

这是我的代码:

void numbers(ostream& outs, const string& prefix, unsigned int levels){
    if (levels > 1){

        for (int i = 1; i <= 9; i++){
            for (int k = 1; k <= 9; k++){
                string s = prefix + char('0' + i);
                s  += '.';
                s += char('0' + k);
                s  += '.';
                outs<<s<<endl;
            }

        }
        numbers(outs, prefix, levels - 1);
    }

    else{
        levels = 0;
        if (levels == 0){
            cout<<prefix<<endl;
        }
    }
}

2 个答案:

答案 0 :(得分:2)

我建议使用回溯:

#include <iostream>
#include <string>
using namespace std;

void numbers(ostream& outs, const string& prefix, unsigned int levels){

    if (levels == 0) {
        outs << prefix << endl;
        return;
    }

   for (int i = 1; i <= 9; i++){
        string dot = (levels == 1 ? "" : "."); //handle the case the lowest level
        string s = prefix +  std::to_string(i) + dot;
        numbers(outs, s, levels - 1);
   }
}

int main() {
    int level = 3;
    numbers(cout, "", level);
    return 0;
}

答案 1 :(得分:0)

试试这个

#include <iostream>
#include <string>
using namespace std;

void numbers(string& outs, const string& prefix, unsigned int levels){
    if (levels >= 1){
        for (int k = 1; k <= 9; k++){
            string tmpOut = outs + char('0' + k) + ".";
            numbers(tmpOut, prefix, levels - 1);
        }
    }
    else{
        outs.erase(outs.size() - 1, 1);
        cout<<prefix<< outs << endl;
    }
}

int main()
{
   string out;
   numbers(out, "prefex ", 2);
   numbers(out, "prefex ", 3);
   return 0;
}

稍后我会描述它