递归加法差异
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+=1
将 level
的值递增 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
我正在处理一个递归问题(在 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
的值加1level++
传递level
的 原始 值,然后将level
的值递增 1level+=1
将level
的值递增 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