如何更正此递归代码

本文关键字:代码 递归 何更正 | 更新日期: 2023-09-27 18:27:33

我有下面的递归函数,它应该沿着树向下移动,只显示根节点。这有两个问题。1.并非所有代码路径都返回一个值。2.DisplayLeafNode函数在for循环中不会被调用多次,因为它是在第一次调用后返回的。

 @functions
    {
        public static HelperResult DisplayLeafNode(Node node)
        {
            if (node.nodes != null)
            {
                for (int i = 0; i < node.nodes.Count; i++)
                {
                   return @DisplayLeafNode(node.nodes[i]);
                }
            }
            else
            {
                return DisplayNode(node);
            }
        }
    }
    @helper DisplayNode(Node node)`enter code here`
    {
        <a>
            @node.NodeName
        </a>
    }

有人能帮我纠正一下吗?

如何更正此递归代码

递归函数调用自己,因此您的代码应该是:

@helper DisplayNode(Node node)
{
    <a>
        @node.NodeName
    </a>
    @if(node.Nodes != null)
        @foreach(Node innernode in node.Nodes)
        {  
            @DisplayNode(innernode)
        }
}

只需调用模板中的@DisplayNode(root)(这意味着DisplayLeafNode函数不是必需的)。

具体来说,您想要实现什么?你想退货什么?假设您想要返回Node。我相信一个Node会有两个道具(一个值和对其Node.的其他引用,或者可能是一个节点列表)。

要回答要实现的目标,了解如何为Node安排数据结构会更有用。根据你的ds,你可以使用一种更干净的算法方法来检查节点ref,并根据其计数,进一步向下或向上到达你的最后一个节点或父节点。

如果你必须返回一个HelperResult,但没有找到合适的方法,那么你可以更好地创建一个新的HelperResult。如果你对内存消耗很挑剔,这肯定是一个缺陷,但更愿意在你想何时返回以及你想返回什么方面采取更清洁的方法。