C++ 需要重构深度嵌套代码的帮助吗 #包括 使用名称空间std; int main() { 整数范围=20; 整数=0; 对于(int i=1;ii) { for(int j=1;ji) { 对于(int k=1;kj) { 对于(int l=1;lk) { 对于(int m=1;ml) { 用于(int f=1;fm) { cout

C++ 需要重构深度嵌套代码的帮助吗 #包括 使用名称空间std; int main() { 整数范围=20; 整数=0; 对于(int i=1;ii) { for(int j=1;ji) { 对于(int k=1;kj) { 对于(int l=1;lk) { 对于(int m=1;ml) { 用于(int f=1;fm) { cout,c++,refactoring,C++,Refactoring,你能做的第一件事是: for(int i=1;i 为什么不从range开始i来避免这个问题呢?哦,我倒是这么想的,但关键是——你可以很容易地将它重构为for条件的一部分。不需要额外的条件 if(range>i) 为什么不在i开始j …(对其他两个循环重复) 这就消除了一半的嵌套。就循环本身而言,我建议对它们使用提取方法。重构任何东西的方法都是一样的。你首先必须弄清楚是什么 代码正在运行。在这种情况下,许多测试都是无关的,并且 每个循环基本上做相同的事情。你已经解决了一个非常复杂的问题 一

你能做的第一件事是:

for(int i=1;i
为什么不从
range
开始
i
来避免这个问题呢?哦,我倒是这么想的,但关键是——你可以很容易地将它重构为
for
条件的一部分。不需要额外的条件

if(range>i)
为什么不在
i
开始
j

…(对其他两个循环重复)


这就消除了一半的嵌套。就循环本身而言,我建议对它们使用提取方法。

重构任何东西的方法都是一样的。你首先必须弄清楚是什么 代码正在运行。在这种情况下,许多测试都是无关的,并且 每个循环基本上做相同的事情。你已经解决了一个非常复杂的问题 一个更一般问题的具体案例(非常草率)。解决 该问题的通用算法将产生更清晰、更简单的结果 解决方案,一个更通用的解决方案。类似于:

if(j>i)
类组合
{
int m;
int n;
整数合计;
std::向量值;
void calc();
void dumpVector()常量;
公众:
combi(intm,intn):m(m),n(n),total(0){
int运算符(){total=0;values.clear();calc();return total;}
};
无效的
combi::calc()
{
if(values.size()==m){
dumpVector();
++总数;
}否则{
values.push_back(values.empty()?0:values.back()+1);
int limit=n-(m-values.size());
while(values.back()STD::CUT< P>我的C++是生锈的,所以我给你举一个C例子。任何数量的嵌套循环都可以用一个替换,如下:

class Combin
{
    int m;
    int n;
    int total;
    std::vector<int> values;

    void calc();
    void dumpVector() const;
public:
    Combin( int m, int n ) : m(m), n(n), total(0) {}
    int operator()() { total = 0; values.clear(); calc(); return total; }
};

void 
Combin::calc()
{
    if ( values.size() == m ) {
        dumpVector();
        ++ total;
    } else {
        values.push_back( values.empty() ? 0 : values.back() + 1 );
        int limit = n - (m - values.size());
        while ( values.back() < limit ) {
            calc();
            ++ values.back();
        }
        values.pop_back();
    }
}

void
Combin::dumpVector() const
{
    for (std::vector<int>::const_iterator iter = values.begin(); iter != values.end(); ++ iter )
        std::cout << ' ' << *iter + 1;
    std::cout << '\n';
}

int main()
{
    Combin c( 6, 20 );
    std::cout << "TotalCombinations:" << c() << std::endl;
    return 0;
}
public void ManyNestedLoopsTest()
{
var限制=新[]{2,3,4};
var置换=新[]{1,1,0};
常量int lastDigit=2;
var digitToChange=最后一位数字;
而(数字更改>=0)
{
if(置换[digitToChange]<限制[digitToChange])
{
置换[数字变换]+;
digitToChange=最后一位数字;
印刷置换(置换);
继续;
}
置换[digitToChange--]=1;
}
}
私有无效打印置换(int[]置换)
{

对于(int i=0;i意外标记为C。抱歉!您可以这样做。或者您可以消除完全冗余的IF测试(如我所述…).1因为这更普遍地解决了问题,但我认为对于这种特定情况存在更好的解决方案。代价是使代码不可读和不可维护。第一个是Billy ONeal所说的:消除不必要的
if
s(无论如何,第一个if总是错误的)@詹姆斯·坎兹:我同意这些检查是不必要的,但我建议的重构可以正式进行,这样可以更容易地注意到这些检查是不必要的。@sharptooth什么重构。你的建议使流程复杂化,并使任何关于正在发生的事情的分析变得更加困难。@詹姆斯·坎兹:这是非常重要的主观的。我个人觉得带有
continue
的代码更容易分析。
if(j>i)
class Combin
{
    int m;
    int n;
    int total;
    std::vector<int> values;

    void calc();
    void dumpVector() const;
public:
    Combin( int m, int n ) : m(m), n(n), total(0) {}
    int operator()() { total = 0; values.clear(); calc(); return total; }
};

void 
Combin::calc()
{
    if ( values.size() == m ) {
        dumpVector();
        ++ total;
    } else {
        values.push_back( values.empty() ? 0 : values.back() + 1 );
        int limit = n - (m - values.size());
        while ( values.back() < limit ) {
            calc();
            ++ values.back();
        }
        values.pop_back();
    }
}

void
Combin::dumpVector() const
{
    for (std::vector<int>::const_iterator iter = values.begin(); iter != values.end(); ++ iter )
        std::cout << ' ' << *iter + 1;
    std::cout << '\n';
}

int main()
{
    Combin c( 6, 20 );
    std::cout << "TotalCombinations:" << c() << std::endl;
    return 0;
}
    public void ManyNestedLoopsTest()
    {
        var limits = new[] {2, 3, 4};
        var permutation = new[] {1, 1, 0};
        const int lastDigit = 2;
        var digitToChange = lastDigit;
        while(digitToChange >= 0)
        {
            if (permutation[digitToChange] < limits[digitToChange])
            {
                permutation[digitToChange]++;
                digitToChange = lastDigit;
                PrintPermutation(permutation);
                continue;
            }
            permutation[digitToChange--] = 1;
        }
    }

    private void PrintPermutation(int[] permutation)
    {
        for(int i=0;i<3;i++)
        {
            Console.Write(permutation[i]);
            Console.Write(" ");
        }
        Console.WriteLine(" ");
    }