递归函数中++ i和i = 1之间的差异

时间:2017-04-30 08:59:52

标签: java recursion binary-tree

我试图用preordertraverse编写一个toString方法。这是两个功能。在preOrderTraverse中,当我写++深度和深度+ 1时,有两个不同的输出。

public String toString()
{
    StringBuilder sb = new StringBuilder();
    preOrderTraverse(root, 1, sb);
    return sb.toString();
}
private void preOrderTraverse(Node<E> node, int depth, StringBuilder sb)
{
    for(int i = 1; i < depth; ++i)
        sb.append("      ");
    if(node == null)
        sb.append("null\n");
    else
    {
        sb.append(node.toString());
        sb.append("\n");
        preOrderTraverse(node.left,depth + 1, sb);
        preOrderTraverse(node.right,depth + 1,sb);
    }
}

这给了我这个

  50
        30
              null
              null
        70
              null
              null

如果我写这个

preOrderTraverse(node.left,++depth, sb);           
preOrderTraverse(node.right,++depth,sb);

我得到了这个

  50
       30
            null
                 null
            70
                 null
                      null

为什么会这样?

2 个答案:

答案 0 :(得分:2)

preOrderTraverse(node.left,depth + 1, sb);
preOrderTraverse(node.right,depth + 1,sb);

两个递归调用都获得第二个参数的相同值,因为depth + 1不会更改局部变量depth的值。

preOrderTraverse(node.left,++depth, sb);           
preOrderTraverse(node.right,++depth,sb);

第二次递归调用传递的值比传递给第一次调用的值大1,因为++depth会增加局部变量depth的值。

前者似乎是正确的方式。

答案 1 :(得分:2)

++depth递增值之后返回值。如果有两个递增值的命令,那么该值将在两个命令之间发生变化。

preOrderTraverse(node.left,  ++depth, sb);           
preOrderTraverse(node.right, ++depth, sb);

大致相当于*:

depth = depth + 1;
preOrderTraverse(node.left,  depth, sb);
depth = depth + 1;           
preOrderTraverse(node.right, depth, sb);

*它至少不是完全等价的,因为操作是在node.left之后和sb的评估之前评估的(假设Java解释器遵循从左到右的规则进行函数参数评估)