2014-10-29 56 views
0

假設我有一個函數:自稱爲N次的C++遞歸函數?

int recursive(int NbProducts, int NbPlates, int NbPositions) 
{ //the following is a recursive function that will call itself 3 times 
//code to be repeated goes here 
recursive(int NbProducts, int NbPlates, int NbPositions); 
} 

我想不通的是如何能夠讓函數知道遞歸數它的上,以及如何阻止它。任何有效和聰明的方法來做到這一點?如果有幫助,我使用boost算法。

+7

最直接:將它作爲參數傳遞..你有任何簽名限制嗎? – 2014-10-29 12:46:04

+1

通常遞歸調用有一些不遞歸的標準。在這種情況下,如果它確實是一個特定的計數而沒有其他標準,則可以將計數作爲參數傳遞(如@MarcoA所示)並在每次調用時遞減計數。當你看到它歸零時,那就是你沒有遞歸的時候。 – lurker 2014-10-29 12:48:31

回答

4

傳遞給它的參數和執行功能。如果迭代結束後,返回結果前檢查,否則繼續

int recursive(int NbProducts, int NbPlates, int NbPositions,int repeat) 
{ 
repeat --; 
    if(repeat==0) 
return result; 
    else 
recursive(NbProducts, NbPlates, NbPositions, repeat); 
} 

如果你希望它重複3次,你只要說

recursive(NbProducts, NbPlates, NbPositions, 3); 
1

(警告:如果你沒有任何功能限制的簽名,你沒有指定,所以我假設你沒有這隻會工作)

最簡單,最直接的一個:把它作爲一個參數,儘管這將需要修改函數簽名:通過遞減至零值

// Start 
recursive(par1,par2,par3, 0 /* Iteration number */); 

int recursive(int NbProducts, int NbPlates, int NbPositions, int iteration) 
{ 
    if(iteration == 2) 
    return something; 
    else { 
    ++iteration; 
    return recursive(par1,par2,par3,iteration); 
    } 
} 

或等效。在很多情況下,這也是最常用的方式prolog和其他邏輯語言限制它們的遞歸深度。

1

嘗試這樣:

int arecursive(int NbProducts, int NbPlates, int NbPositions, int count) 
{ 
    if (count == 0) { 
    // ... 
    { 
    else 
    return recursive(NbProducts, NbPlates, NbPositions, count -1); 
} 

int recursive(int NbProducts, int NbPlates, int NbPositions) 
{ 
arecursive(NbProducts, NbPlates, NbPositions, 3); 
} 
0

如果你可以改變函數簽名,把它作爲一個參數:

int recursive(int NbProducts, int NbPlates, int NbPositions,int repeat) { 
    return (repeat == 1 ? result : recursive(NbProducts, NbPlates, NbPositions, repeat-1); 
} 

,如果你不能改變的簽名,則需要函數範圍中的一個變量來跟蹤它。成員變量和包裝函數。

int recursive(int NbProducts, int NbPlates, int NbPositions) { 
    return (m_repeat == 1 ? result : recursive(NbProducts, NbPlates, NbPositions, m_repeat-1); 
} 

int recursive(int NbProducts, int NbPlates, int NbPositions,int repeat) { 
    m_repeat = repeat; // setting the member variable repeat before calling the function 
    recursive(NbProducts, NbPlates, NbPositions); 
    m_repeat = 0; // just in case 
}