Java 与x2B之间的差异+;递归函数中的i和i=1
我试图用preordertraverse编写一个toString方法。这里有两个函数。在preOrderTraverse中,当我编写++深度和深度+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(
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);