递归时的变量值保留

时间:2014-06-24 05:55:56

标签: java recursion

我有以下伪代码,如果tree是binaryTree的实例,我需要更新计数器值。如果树有更多的孩子,我会递归地调用这个方法。增加柜台。

问题是如果我使计数器静止(我不想),计数器值很好但是当我将变量作为输入传递给方法时(如下所述)我只是得到了值这有什么问题?

//Pseudo code
public static int test(tree) {
    Integer count = 0;
    return testTreeRecCounts(tree, count);
}

private static Integer testTreeRecursiveCounts(tree, Integer count) {
    if (tree instanceof  binaryTree) {
        count++;
        for (Node node :tree.getChild())) {
            testTreeRecursiveCounts((tree)node, count);
        }
    }
    return count;
}

1 个答案:

答案 0 :(得分:5)

问题是Integer 不可变,所以当您执行此操作count++时,count将指向不同的对象。

过程是:count - >拆箱 - >将值增加1 - >;自动装箱(创建一个新对象)。

这就是为什么,只有第一个值为1的对象才会返回。

另请注意,使用Integer而不是原始int会降低性能,因为它需要连续进行自动装箱/取消装箱。

可以通过执行以下操作来解决此问题:

private static int testTreeRecursiveCounts(tree) {
    int count =0;
    if (tree instanceof  binaryTree) {
        count++;
        for (Node node :tree.getChild())) {
           count += testTreeRecursiveCounts((tree)node);
        }
    }
    return count;
}