2015-11-05 178 views
-3

我正在編寫一個涉及鏈表的程序。我寫了一個函數,它返回鏈表中的第n個節點,它會遞歸地調用它自己。我的程序編譯並運行直到遞歸函數,然後崩潰。這裏是節點的構造函數以及遞歸函數:遞歸函數在運行時崩潰

LinkedList::LinkedList(): 
    head(head){ 
     sizeInt = 0; 
} 

Node* LinkedList::get_nth(const int& n) const { 
    Node* node = new Node(); 
    for(int counter = 1; counter <= n; counter++){ 
     node = get_nth(counter + 1); 
    } 
    return node; 
} 

這個函數有什麼問題?讓我知道你是否需要更多的細節或代碼。

+1

'n'有多大? – NathanOliver

+0

到目前爲止,它僅僅是最大的10 – KOB

+0

崩潰如何?什麼是錯誤信息? –

回答

4

遞歸是無限的。在每次致電get_nth時,您都會啓動一個循環,最初調用get_nth(1),這將調用get_nth(1),並且將調用get_nth(1) ...直到堆棧空間用完。

解決方案提示:遞歸線性搜索不需要循環。

+0

這很有道理,謝謝。因此,本工作的一些內容如下: 在get_nth函數之外設置counter = 1。如果'counter == n'返回節點的'if'語句。調用'get_nth(counter + 1)'的'else'語句? – KOB

+0

@KOB您不能從列表頭開始遞歸調用,所以您應該將節點傳遞給遞歸搜索。首先打電話給頭部,下一個頭部 - >下一個。通過節點,傳遞計數器並遞歸遞減。當你用0調用它時,返回節點。 – user2079303

+0

@KOB如果n大於0,則從當前節點查找第n個節點與查找下一個節點的第(n-1):th節點相同。不要使用全局變量。不要使用循環。 – molbdnilo

5

沒有什麼阻止遞歸(除其他外,有一個遞歸調用與n增加到n + 1

這是您的溢出堆棧,程序會崩潰作爲一個結果。