2014-03-31 60 views
0

所以我有這個函數和這些全局變量。在遞歸函數中打印C++中的累加和

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,它是這個組合等於第一個參數,使資金和substractions和號碼,每次的組合,全局變量result增加。例如,count2(6,{1,2,3,3,3},0,0,true,0);將使result爲5.由於有5種方式與這些數字相加/子6,例如:1+2+3+3-31+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,它會打印:YES,這是我的實際結果。但是,是不正確的,因爲沒有和諸如+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 

〜12 + 3 + 3 + 3

回答過的問題!

+0

什麼問題? –

+0

@NeilKirk如何打印正確的操作?像'1 + 2 + 3 + 3-3 1 + 2-3 + 3 + 3 -1-2 + 3 + 3 + 3 1 + 2 + 3-3 + 3等等。 –

+0

通過按值傳遞向量d,您正在複製它幾次。這是低效的。通過const引用傳遞。您應該返回結果而不是修改全局變量。爲什麼mas和menos不是局部變量? –

回答

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

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

條件運算符將從頭開始刪除'+'符號。默認值使該函數更容易從主或任何地方調用。通過發送temp作爲string,可以更輕鬆地跟蹤最終方程,並將其作爲全局變量移除。它也消除了您的bool flag變量的需要。最後,在函數調用中更新total以從函數體中刪除混亂。

+0

這個工程,但我仍然需要像123 + 45組合。一個解決方案已經被發現。 –