我正在弄乱一个递归问题(在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);
}
我得到了不同的答案。 我知道最后2个,如何在添加1之前传递原始值,然后将其添加到值中然后将其传递,但不确定第一个与其余部分的区别
答案 0 :(得分:1)
level + 1
不会更改level
的值,只会传递level
加1 level++
传递level
的原始值,然后将level
的值增加1 level+=1
将level
的值增加1,然后传递 new 值level=+1
相当于level= +1
,其中+
是unary +
operator,因此它将level
设置为等于1并传递此 new 强>价值更新:
第一个和第三个版本将相同的值传递给递归调用,但可能会有不同的行为,具体取决于之后是否使用变量level
。
答案 1 :(得分:1)
实际上你可以只进行一个简单的测试来看看发生了什么:
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
答案 2 :(得分:0)
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个案例中,你实际上做了不同的事情,因此结果不同。