2014-10-12 39 views
0

我試圖編寫一個函數,它可以遞歸地檢測堆棧中負數的整數。目前下面的代碼片段是我的,但是到目前爲止還沒有給出正確的答案。我測試了11個元素和7個底片的堆棧,並得到了下面給出的輸出。循環結構肯定有問題,但我還沒有找到並修復它。任何幫助將不勝感激!無法在遞歸函數中生成正確的輸出?

12356657235681623569772357137235729723574562357617235777623579372358096 

我下面的功能:

size_t r_func(stack<int> st1) 
{ 
    if(st1.size() == 0) return 0; 
    int r = st1.top(); 
    st1.pop(); 
    cout << (r<0)+r_func(st1); 
} 
+0

你也可以顯示函數聲明嗎? – Rufflewind 2014-10-12 00:12:45

+0

@Rufflewind完成! – sparta93 2014-10-12 00:14:00

+0

即使您聲明它返回size_t,您的函數在st1.size()不爲零時也不會返回任何內容。你看到的數字只是堆棧中的隨機垃圾。 (建議:編譯時一直編譯警告。) – Rufflewind 2014-10-12 00:15:25

回答

1
size_t r_func(stack<int> st1) 
{ 
    if(st1.size() == 0) return 0; 
    int r = st1.top(); 
    st1.pop(); 
    cout << (r<0)+r_func(st1); 
} 

r_func應該返回一個size_t,但如果st1.size()不爲零,那麼它不會返回任何東西。編譯器應該給你一個警告!

要糾正這一點,添加一個返回的籌碼負數的數行:

​​

編輯:爲了寫這tail-recursively,有必要跟蹤大小的累加器(這裏叫做neg_accum):

size_t r_func(stack<int> st1, size_t neg_accum = 0) 
{ 
    if (st1.size() == 0) { 
     cout << neg_accum; 
     return neg_accum; 
    } 
    int r = st1.top(); 
    st1.pop(); 
    return r_func(st1, (r < 0) + neg_accum); 
} 
+0

執行上述更改後,我得到輸出12234556677而不是7.我再次使用相同的堆棧進行測試,其中包含7個底片和總共11個元素。 – sparta93 2014-10-12 00:28:34

+0

嗯,我認爲這就是你想要的!如果將'cout'放入遞歸函數中,它將被調用*每個元素*。如果你不想這樣做,你需要按照丹尼爾L的建議在外面拉上'cout'。 – Rufflewind 2014-10-12 00:30:25

+0

啊,我不應該把cout放在那裏,但是是的,我希望函數只給我堆棧中的底片數量。因此,對於上面提到的例子,我希望它輸出7.同樣如丹尼爾L建議,他的方法會工作,但我希望函數可以直接調用,而不使用cout。 – sparta93 2014-10-12 00:34:46

0

正如Rufflewind說,你應該更換 'COUT < <' 與 '迴歸' 和調用函數中這樣說:「清點< < r_func(ST1) ;」