java -++i 和 i = 1 在递归函数中的区别

标签 java recursion binary-tree

我试图用 preordertraverse 编写一个 toString 方法。这里有两个函数。在 preOrderTraverse 中,当我写++depth 和 depth + 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

为什么会这样?

最佳答案

++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 解释器遵循从左到- 函数参数评估的正确规则)。

关于java -++i 和 i = 1 在递归函数中的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43704674/

相关文章:

java - 当我告诉它运行 Java 14 时,为什么 Gradle 会尝试使用 Java 8?

python - Python 不需要 Y-Combinator 吗?

java - Android/FireStore QuerySnapshot 转换为 CustomObject

java - 如何将焦点设置到EditText中提示后的文本上?

java - 对象输入流读取对象 EOFException

linux - shell脚本中的递归

Java递归迷宫求解器问题

c - 从二叉树中删除

Java TreeMap 排序选项?

c - 在 C 中设置用于二分搜索的结构和节点,内存违规