簡體   English   中英

從遞歸 void 方法返回不會退出遞歸

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM