在递归函数中以C ++打印累积的总和

时间:2014-03-31 01:57:49

标签: c++ string c++11 printing

所以我有这个函数和这些全局变量。

int recurs=0;
std::string sign="";
void count2(int k, std::vector<int> d, int total, int temp, bool flag, unsigned short int pos){
    std::string mas="+";
    std::string menos="-";
    if(pos==(d.size())){
        total+=temp;
        if(total==k){
            result++;
            std::cout << sign << "=" << k<<std::endl;
            str="";
        }
        recurs++;
        return;
    }    
    //Sum sign.
    sign=sign.substr(0,sign.size()-recurs*2);
    sign.append(mas+=std::to_string(d[pos]));
    count2(k,d,total+temp,+d[pos],true,pos+1);  
    //Rest sign
    sign=sign.substr(0,sign.size()-recurs*2);
    sign.append(menos+=std::to_string(d[pos]));
    count2(k,d,total+temp,-d[pos],false,pos+1);  
    //Append digit
    if(flag==true)
        count2(k,d,total,10*temp-d[pos],true,pos+1);
    else
        count2(k,d,total,+10*temp+d[pos],false,pos+1);
}

这个函数被调用如下: count2(6,{1,2,3,3,3},0,0,true,0);

它的作用:给定一个向量v,它组合了和,减法和数字,每当这个组合等于第一个参数时,全局变量result就会增加。例如,count2(6,{1,2,3,3,3},0,0,true,0);会使result为5.因为有5种方法可以将这些数字相加/相加6,例如:1+2+3+3-3 1+2-3+3+3和其他一些数字。它完美地运作。此外,不使用变量字符串str

有什么问题?没什么,但我想知道这些组合是什么。我想要打印的功能就像:

1+2+3+3-3
1+2-3+3+3
-1-2+3+3+3
1+2+3-3+3

问题是什么?我想知道如何正确打印总数等于k的操作数。 如果你去run this code in ideone,它会打印:是的,这是我的实际结果。但是不正确,因为没有总和,如+3或+ 3 + 3 + 3 + 3 + 3 + 3 + ....

+1+2+3+3-3=6
+3=6
+3-3+3-3-3+3+3=6
+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-1+2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3=6
+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-1+2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3+2+3+3+3-3-3+3-3+3-3-3+3+3-3-3+3-3+3-3+3+3-3-3+3-3+3-3-2+3+3+3=6

正确的结果 可以看起来像:

1+2+3+3-3
1+2+3-3+3
1+2-3+3+3

-1-2 + 3 + 3 + 3

问题已解答!

2 个答案:

答案 0 :(得分:1)

如果您不介意我稍微更改功能签名,我可以建议以下内容吗?

int recurs = 0;
void count2(int k, std::vector<int> d, int total = 0, std::string temp = "", unsigned short pos = 0)
{
    if(pos == d.size())
    {
        //test total number
        if(total == k)
        {
            std::cout << temp <<"=" << k << std::endl;
            recurs++;
        }
    }
    else
    {
        //test each operator on next number in sequence
        count2(k, d, total + d[pos], temp + ((pos) ? "+":"") + std::to_string(d[pos]), pos + 1);
        count2(k, d, total - d[pos], temp + "-" + std::to_string(d[pos]), pos + 1);
    }
}

条件运算符将从头开始删除“+”符号。默认值使函数更容易从main或where调用。通过将温度作为string发送,可以更容易地跟踪最终的等式,并将其作为全局变量删除。它还消除了对bool flag变量的需求。最后,在函数调用中更新total以从函数体中删除杂乱。

答案 1 :(得分:0)

所以最后count2看起来像这样:

void count2(int k, std::vector<int> d, int total, int temp, bool flag, unsigned short int pos, std::vector<std::string> s){
    //std::cout << temp << " ";
    if(pos==(d.size())){
        total+=temp;
        if(total==k){
            result++;
            for(unsigned short int i=0;i<d.size();i++){
                std::cout << s[i] << d[i];
            }
            std::cout << "=" << k <<"\n";
        }
        return;
    }
    s[pos]="+";
    count2(k,d,total+temp,+d[pos],true,pos+1,s);
    //put a - sign in pos
    s[pos]="-";
    count2(k,d,total+temp,-d[pos],false,pos+1,s);
    if(pos==0) return;
    //Append digit
    if(flag==true){
        s[pos]="";
        //std::cout << "<0 " << 10*temp-d[pos] << " ";
        count2(k,d,total,(10*temp-d[pos]),true,pos+1,s);
    }
    else{
        s[pos]="";
        //std::cout << ">0" << 10*temp+d[pos] << " ";
        count2(k,d,total,10*temp+d[pos],false,pos+1,s);
    }

}

你可以看到而不是使用字符串变量,我正在使用字符串向量,这使它适用于递归调用。

Give it a try on ideone.com