Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/369.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 与x2B之间的差异+;递归函数中的i和i=1_Java_Recursion_Binary Tree - Fatal编程技术网

Java 与x2B之间的差异+;递归函数中的i和i=1

Java 与x2B之间的差异+;递归函数中的i和i=1,java,recursion,binary-tree,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(

我试图用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);
    }
}
如果我写这个

preOrderTraverse(node.left,++depth, sb);           
preOrderTraverse(node.right,++depth,sb);
我明白了

  50
       30
            null
                 null
            70
                 null
                      null
为什么会发生这种情况?

preOrderTraverse(node.left,depth + 1, sb);
preOrderTraverse(node.right,depth + 1,sb);
由于
depth+1
不会更改局部变量
depth
的值,因此两个递归调用都会为第二个参数获取相同的值

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


前者似乎是正确的方法。

++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解释器遵循从左到右的函数参数求值规则)

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);