2012-09-23 78 views
0

我寫了這個函數來跟蹤拓撲樹中的某個點。但是由於某種原因。它的無限。使用STL遞歸?

int electricity(int x){ 
    multimap<int,entita,greater<int> >::reverse_iterator it = siet.rbegin(); 
    advance(it,x-1); 
    if((*it).second.z=='E') return (*it).second.i; 
    return electricity((*it).first); 
} 

我在運行時調試了變量,我100%確定X不同於(* it).first。然而,由於某種原因,每次下一個函數調用x都保持不變。在這種情況下(4)。任何想法爲什麼?

+0

正如旁註:您可以像指針一樣取消引用迭代器:例如, 'it-> second.z'與'(* it).second.z'相同。 (當迭代器取消引用指針類型時,這會有點棘手,但在這裏並不是這樣) – Nobody

+0

地圖中有多少個鍵?難道是'advance'改變''它是'siet.rend()'迭代器嗎? – Nobody

+0

我知道,但我學到了一半。不知何故,這成爲我的偏好。 –

回答

2

當multimap包含一個「引用」到自身或其他直接或間接「引用」它的項目時,您將獲得無限遞歸。

打破無限遞歸你有兩個選擇:

  • 確保沒有周期(如果有螞蟻如果可能的話,解決這些問題),然後調用這個函數
  • 或保留跟蹤此功能中的週期。
0

你的遞歸可在這種情況下無限:

int electricity(int x){ // You call with some X 
    multimap<int,entita,greater<int> >::reverse_iterator it = siet.rbegin(); 
    advance(it,x-1); // Now *it at some element, lets call it Z 
    if((*it).second.z=='E') // False for Z 
     return (*it).second.i; 
    return electricity((*it).first); // Call himself with same X, e.g. X == it->first 
} 

所以,理由是無限的是:這個算法是錯誤的;或獲取意外的數據siet