[英]returning from a recursive void method doesn't exit the recursion
我不習慣寫遞歸,但以前從未遇到過類似的問題。
在 C# 中,我有一個遞歸方法,它有一個明確的基本情況:當 colors 的所有集合都被替換時,退出並將那個添加到最終結果中。 這是我的代碼
private void ColorCanBeReplacedRecursively(
IList<IGrouping<string, Element>> userColorBag,
IList<IGrouping<string, Element>> setColorBag)
{
if (setColorBag.Count == 0) // if all color groups are replaced
{
return;
}
foreach (var setColor in setColorBag)
{
var futureSetColorBag = new List<IGrouping<string, Element>>();
futureSetColorBag.AddRange(setColorBag);
for (var i = 0; i < userColorBag.Count; i++)
{
var futureUserColorBag = new List<IGrouping<string, Element>>();
futureUserColorBag.AddRange(userColorBag);
var userHasAllPieces = HasUserAllSetPiecesInSpecificColor(userColorBag[i], setColor);
if (userHasAllPieces)
{
futureUserColorBag.RemoveAll(u => u.Key.Equals(userColorBag[i].Key));
futureSetColorBag.RemoveAll(s => s.Key.Equals(setColor.Key));
ColorCanBeReplacedRecursively(futureUserColorBag, futureSetColorBag);
}
}
}
}
這是我第一次調用遞歸方法的方式
foreach (var set in caseSets)
{
ColorCanBeReplacedRecursively(userGroupBy, setGroupBy);
_expandedSets.Add(set);
}
經過一些遞歸后,futureSetColorBag 的計數變為 0,它甚至進入 if(count==0) 但問題是返回並沒有完全退出遞歸方法。 它返回循環並 setColorBag 找到一些項目再次迭代? 我在這里做錯了什么?
return
僅從當前調用返回。 它將返回到仍在循環中的父調用。 返回只會從調用堆棧中刪除最頂層的調用幀。 所有其他調用幀不受影響。 這就是遞歸的工作原理:)
如果你想展開你的完整堆棧,你必須從你的方法返回一些東西(比如布爾值),然后在調用站點使用這個返回值來決定你是否也想返回(然后從調用者返回) ,從調用調用者返回,等等)。
像這樣(偽代碼):
boolean Recurse(object param)
{
if (abort)
{
return true;
}
foreach (var item in items)
{
if (Recurse(param))
{
return true;
}
}
return false;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.