使用递归打印分段号

Printing section numbers using recursion

本文关键字:段号 打印 递归      更新时间:2023-10-16

我有一个函数void numbers(ostream& outs, const string& prefix, unsigned int levels);,它将输出输出到ostream输出

输出由字符串前缀后跟形式为1.1的"节号"组成。1.2点。1.3点。等等。levels参数决定了区段号有多少个级别。例如,如果levels为2,则分段号的形式为x.y。如果levels为3,则分段号的形式为x.y.z。每个级别允许的数字始终为'1'到'9'。例如,如果prefix是字符串"THERBLIG"并且level是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;
        }
    }
}

我的建议使用回溯:

#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;
}

试试这个

#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;
}

后面我会描述