2012-05-09 104 views
0

我有一個關於C++的問題。所以我製作了這個程序,計算所有可能的組合來解決使用遞歸(而不是9個循環)的問題。這是代碼的一部分:遞歸重啓循環(C++)

int used[9]; 
nMin=1000; 

void Combinations(int index) 
    { 
     if(index>8) 
     { 
     return; 
     } 
     for(int i=k;i<4;i++) 
     { 
     used[index]=i; 
     if (sum<nMin && Check())//Checks the solution 
     { 
      nMin = sum; 
      used[i]=0; 
      return; 
     } 
     else 
     { 
      Combinations(index+1); 
     } 
     } 
} 

for循環,應該每次重複遞歸調用返回時重複4次。換句話說,循環變量被設置爲0.這就是它的工作方式,是否必須存儲當前循環變量值,或者是否有其他方法。

編輯:謝謝你們,詳細信息和你的答案。代碼經過一些調整後才起作用。

+0

是「我是如何運作的」一個問題或陳述? – Joe

+0

呃什麼是'k'? – Pierre

+0

您的投訴是否在'Combinations(index + 1)'調用後將'i'設置爲0?如果是這樣,你如何測試這個,你確定你沒有看另一個'我'的化身? –

回答

2

int i是一個局部變量,它存在於該函數調用的那個for循環的上下文中。當您對同一個函數進行遞歸調用時,您正在堆棧中推送該函數調用的一個全新實例,該實例具有自己的for循環,其變量爲int i。他們沒有任何聯繫。

如果你想給函數的所有遞歸調用共享一個計數器,你需要將它定義爲一個靜態變量,定義它的範圍之外的循環,就像這樣:

void Combinations(int index) 
{ 
    static int persistentCounter; 

這將在遞歸調用中保持它的價值。

2

如果我正確閱讀這個問題,你的問題是循環變量i將通過遞歸調用Combinations來保護/保留。

答案是是的,循環計數器的值將被保留。原因是scope。每次調用該函數時,堆棧都會爲當前調用的新變量i創建空間。這意味着在函數調用期間與i的所有交互都與爲該特定呼叫創建的i相關。

注意:C/C++語言標準沒有明確的堆棧概念。這實際上是一個實現自動存儲的實現細節。