递归加法差异

Recursion Addition differences

我正在处理一个递归问题(在 Java 中)并注意到传递以下语句会导致 3 个不同的答案,所以如果有人告诉我有什么区别就太好了

这是我试图递归的函数

    if(root.left != null){
        getVal(root.left, level + 1);
    }

如果要将其切换为

    if(root.left != null){
        getVal(root.left, level++);
    }

    if(root.left != null){
        getVal(root.left, level+=1);
    }

if(root.left != null){
    getVal(root.left, level=+1);
}

我都会得到不同的答案。 我知道最后两个,一个是如何在添加 1 之前传递原始值,一个是如何添加到值然后传递它,但不确定第一个与其余的有何不同

  • level + 1不改变level的值,只是传递level的值加1
  • level++ 传递 level 原始 值,然后将 level 的值递增 1
  • level+=1level 的值递增 1,然后传递此 new
  • level=+1 等同于 level= +1,其中 +unary + operator,因此它将 level 设置为 1 并传递此

更新: 第一和第三个版本将相同的值传递给递归调用,但可能会根据变量 level 是否在之后使用而表现不同。

if(root.left != null){
    getVal(root.left, level + 1);
}

此处您将 ​​level+1 作为参数传递给 getVal(),但您不修改 level 本身。

if(root.left != null){
    getVal(root.left, level++);
}

在这里你将 level 作为参数传递给方法 它增加之前(所以它被逐字传递), 但是 您还修改了 level 值本身(在方法调用之后)。

if(root.left != null){
    getVal(root.left, level+=1);
}

在这里你将 level+1 传递给方法, 你也改变 level 本身(在调用之前)。

if(root.left != null){
    getVal(root.left, level=+1);
}

在这里,您只需将 1 分配给 level 并使用 1 作为参数调用您的方法。

在所有 4 种情况下,您实际上做了不同的事情,因此结果也不同。

其实你可以做个简单的测试看看是怎么回事:

public static void main(String[] args){

    int a=3, b=3, c=3, d=3;
    method(a+1);       //3+1, 4 was passed into the method
    method(b++);       //post increment, 3 was passed into the method, then increase b by 1
    method(c+=1);      //add 1 to c(3), 4 was passed into the method
    method(d=+1);      //d set to 1, 1 was passed into the method

    System.out.println("(Values in main) a:" + a + " b:" + b + " c:" + c + " d:" + d);
}

public static void method(int v){
    System.out.println(v);
}

输出:

4
3
4
1
(Values in main) a:3 b:4 c:4 d:1