如何纠正这个递归代码?

时间:2014-10-23 19:26:30

标签: c# asp.net-mvc recursion

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

 @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>
    }

有人可以帮忙纠正这个吗?

2 个答案:

答案 0 :(得分:1)

递归函数调用自身,因此您的代码应为:

@helper DisplayNode(Node node)
{

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

只需在模板中调用@DisplayNode(root)(意味着不需要DisplayLeafNode功能)。

答案 1 :(得分:0)

具体到底你想要实现什么目标?你想要什么回报?假设你想要返回Node。我相信一个Node会有2个道具(一个值和另一个对它的Node的引用。或者可能是一个节点列表)。

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

如果你必须返回一个HelperResult但找不到合适的方法,那么你可以更好地创建一个新的HelperResult。如果你对内存消耗挑剔,那肯定是个缺陷, 但是,当您想要返回以及想要返回的内容时,我宁愿设备更清晰的方法。