2015-05-04 57 views
-3

我有一個遞歸調用函數:如何用堆棧數據結構替換遞歸函數調用?

void func(int a, bool arr[]) { 
    ... 
    if (...) { 
     func(a, arr); 
    } 
} 

而且從我的主要代碼中調用它像

int int_var = 0; 
bool bool_array[10]; 
func(int_var, bool_array); 

現在我想用一組數據結構來代替該函數的遞歸調用。

我該怎麼做,例如使用std::stack

+8

我也不明白你的問題。你可能是指如何將遞歸函數轉換爲迭代函數?用這些搜索詞,你也應該能夠在網上找到答案。 –

+0

你所看到的甚至看起來都不應該是遞歸的。 'while(!done)manipulate_array();' – crashmstr

+0

_Stack_是一個數據結構,_function_是可調用的代碼實體。也許你想知道如何調用_use_堆棧? (在這種情況下,它取決於編譯器的ABI) – myaut

回答

0

用循環替換遞歸調用並使用std::stack<>非常簡單。

函數調用使用程序/線程內部函數調用堆棧,因此對該函數的遞歸調用僅僅意味着推送堆棧上的實際參數值。
函數返回後,結果被確定,並從堆棧中彈出。

爲了讓更適合的例子,我已經取代你的bool[]陣列,具有std::vector<bool>

struct params { 
    int a; 
    std::vector<bool> arr; 
}; 

std::stack<params> myStack; 

int int_var = 0; 
std::vector<bool> bool_array; 
// put an initial value onto the stack 
myStack.push(params{int_var,bool_array}); 
while(!myStack.empty()) { 
    // compute int_var and the bool_array 
    if(/* ... */) { 
     myStack.push(params{int_var,bool_array}); 
    } 
    else { 
     params p = myStack.top(); 
     myStack.pop(); 
     // handle results of the previous computation 
    } 
}