我正在编写遍历算法,以查找道路中的最长路径。这段代码的神奇之处在于segment.Next是针对LINQ的,具有特定的逻辑,如不重新访问已经访问过的节点。因此,请不要指出遍历中的缺陷,因为这超出了范围。
我的目标是减少堆栈调用次数,因为有时路径可能会达到5000。我知道我必须使这个递归调用尾递归。
我的目标是减少堆栈调用次数,因为有时路径可能会达到5000。我知道我必须使这个递归调用尾递归。
public static IEnumerable<Segment> FindLongestPath(Segment segment)
{
var rv = new List<Segment> {segment};
var longestPathLength = 0;
var longestNextPaths = Enumerable.Empty<Segment>();
foreach (var n in segment.Next)
{
var paths = FindLongestPath(n);
var length = paths.Sum(p => p.LengthMeters);
if (length > longestPathLength)
{
longestPathLength = length;
longestNextPaths = paths;
}
}
rv.AddRange(longestNextPaths);
return rv;
}
我该如何将这个递归调用变成尾递归?我知道我可能需要在遍历时维护 IEnumerable<Segment>
,但我还是无法理解它。