代码之家  ›  专栏  ›  技术社区  ›  0xFF

变量是否在递归函数中共享?

  •  0
  • 0xFF  · 技术社区  · 15 年前

    我试图计算C中递归函数中成功案例的数量,但我惊讶于我的变量在所有函数调用之间共享!

    [更新2]

    这次更奇怪。这样做

    i = i + validTreesFun(tree.Nodes, newWords.ToList()) ;
    

    重置I至0

    这样做

    i = validTreesFun(tree.Nodes, newWords.ToList()) + i ;
    

    给出一些结果(我不确定是否正确)

    [更新:完整代码]

    public static  int validTreesFun(List<Tree<char>> nodes, List<string> words)
        {
            int i = 0;
            if (nodes == null && (words == null || words.Count == 0 || (words.Count == 1 && words.First() == "")))
                return 1;
            else
                if (nodes == null)
                    return 0;
    
            foreach (Tree<char> tree in nodes)
            {
                var validWords = words.Where(w => w.ToCharArray()[0] == tree.Root)
                    .Select(w => w);
                if (validWords.Count() == 0)
                    return 0;
                else
                {
                    var newWords = validWords.Select(w => join( w.ToCharArray().Skip(1).ToArray()));
                    i += validTreesFun(tree.Nodes, newWords.ToList());
                }
            }
            return i;
        }
    

    在调试变量时,我取值1,但在下一次迭代中它重置为0!你说什么? 尽管使用了

    i = i + ....
    

    那段代码有什么问题?

    谢谢你

    4 回复  |  直到 15 年前
        1
  •  5
  •   Marcus Andrén    15 年前
    if (validWords.Count() == 0)
        return 0;
    

    应该是

    if (validWords.Count() == 0)
        continue;
    

    另外,一般来说,我个人认为一次只将一个元素发送到递归函数更好。

    public static  int validTreesFun(Tree<char> node, List<string> words)
    

    这样你就不会犯同样的错误。最后是一个小音符。

    w => w.ToCharArray()[0] == tree.Root
    

    可以写为

    w => w[0] = tree.Root
    
        2
  •  3
  •   Akash Kava    15 年前

    递归调用之间根本没有共享的局部变量,您应该考虑一些其他的设计问题,在foreach循环内部和之后,我看不到任何返回语句,可以发布完整的代码吗?

    好的,在调试过程中,你总是会观察我当前方法的值,在递归函数中调试不好,这有点难以理解,你必须在调用堆栈中向下移动你的控件,以便实际观察当前函数的早期调用方的值。

    我建议您使用您的节点级别输出跟踪或日志文件,这将帮助您进行实际的调试。

    请使用跟踪语句,如下所示。

    Trace.WriteLine(string.Format("{0},{1}",tree.Name,i));
    
        3
  •  1
  •   Daren Thomas    15 年前

    不共享局部变量。 您看到的(重置为0)是(递归地)被调用函数中i的值 validTreesFun (函数开始时设置为0)。

    只要看看你的代码,我想可能有个bug someTestHere -如果这不是真的,那么我将在外部范围内保持0。否则,每进行一次真正的测试,它应该增加1。

        4
  •  -1
  •   Toto    15 年前

    当您处于调试模式时,您确实会看到为调用重新设置了i,但仍保留为调用方所需的值。例如,堆栈:

    validtreesfun——这个i=0

    validTreesFun——对于这一个,i=x,但是如果不遍历调用堆栈,您将看到0,这是堆栈顶部的良好值。