2011-11-20 120 views
1

我只是想測試一些東西。我想知道我做錯了什麼?遞歸函數的分段錯誤

#include <iostream> 
    using namespace std; 
    unsigned long pwr(unsigned long n, unsigned long m) 
    { 
      if(m == 0) 
      n = 1; 
      if(m == 1) 
      n = n; 
      n = pwr(n, m/2) * pwr(n, m/2); 
      return n; 
    } 

    int main() 
    { 
      unsigned long n(2), m(16); 
      cout << pwr(n, m); 
      return 0; 
    } 

輸出

Segmentation fault 
+0

您是否嘗試過使用printf調試來查看它失敗的線路以及它被遞歸的程度? –

回答

6

遞歸沒有退出。

你可能想

  if(m == 0) 
      n = 1; 
      else if(m == 1) 
      n = n; 
      else 
      n = pwr(n, m/2) * pwr(n, m/2); 
      return n; 
+0

工作。非常感謝 – ihm

-1

您除以0:讓我們說米1開始,在接下來的迭代M = 1/2 = 0,你會得到錯誤。 你可能想要做的事情返回1如果m = 0而不是通過方法。

+0

but'if(m == 1)n = n' right?我有這個基地。 – ihm

+1

'm'永遠不會用作除數,只有'2'是。 –

+0

自從您繼續運行該方法以來,它不是基礎。你需要返回一些東西來停止遞歸。 – OSH

2

你不是結束遞歸時,你打你的基本情況。即使m == 0m == 1屬實,您仍然遞歸調用pwr。所以你有無限遞歸。

2

無限遞歸:遞歸調用是無條件執行的,所以調用堆棧會一直增長,直到錯誤停止爲止。

這是一個堆棧溢出。