我需要有人告诉我这两个代码之间的区别:
public static int test(int n)
{
if(n>2){
int sum =0;
int x=n;
if(n%3!=0)
sum+=test(x-1);
System.out.println(n+" ");
sum+=test(x-1)+test(x-2);
return sum;
}
else{
System.out.println(n+" ");
return n+1 ;
}
}
public static void main(String[] args) {
System.out.println(test(5));
}
}
和:
public static int test(int n)
{
if(n>2){
int sum =0;
int x=n;
if(n%3!=0)
sum+=test(--x);
System.out.println(n+" ");
sum+=test(x-1)+test(x-2);
return sum;
}
else{
System.out.println(n+" ");
return n+1 ;
}
}
public static void main(String[] args) {
System.out.println(test(5));
}
}
更确切地说,我对以下几行感到好奇
sum+=test(--x); vs sum+=test(x-1);
它给出了不同的输出,你能告诉我当我们有递归时,recusrion如何表现( - x)
修改
对于sum + = test(x-1),它给出以下内容:
3 2 1 4 3 2 1 2 5 3 2 1 4 3 2 1 2 3 2 1 31我得到这个部分,
但对于sum + = test( - x),输出为:
3 2 1 4 2 1 5 3 2 1 2 18
答案 0 :(得分:3)
如果x
的值为10
,则此行sum+=test(x-1)+test(x-2)
会给出:
sum+=test(9)+test(8);
。
sum+=test(8)+test(7);
为第二个。
因为在第二个示例中,调用--x
将通过递减来更改x
的值。在第一个示例中,由于我们将算术运算的结果作为参数(x-1
)
答案 1 :(得分:0)
使用++ x后,x值会改变
sum+=test(--x); //after this x=x-1
sum+=test(x-1); //after this x is still x
答案 2 :(得分:0)
产生差异的原因是在相关行之后使用了x
。 --x
为您提供与x - 1
相同的值,但它也会将x
的值修改为x - 1
。因此,它将改变该行之后代码的行为。
答案 3 :(得分:0)
递归调用中的--x
和x-1
与非递归调用之间没有区别。实际上,当涉及到递归调用时,与普通调用几乎没有什么区别。一个例子:
public static int test1(int n)
{
System.out.println(n+1);
return n;
}
public static int test2(int n)
{
System.out.println(n++);
return n;
}
public static int test3(int n)
{
System.out.println(++n);
return n;
}
我在这里打电话给System.out.println
,但这无所谓。我可以递归,从被调用者的角度来看,它的工作原理是一样的。参数的表达式在此函数中计算,然后使用它们相应的值进行调用,并在完成后继续执行函数,直到结束或返回语句。
因此,如果我以1
作为参数调用这3个函数,则结果如下:
function prints returns because
test1 2 1 n is never changed in this function
test2 1 2 n is incremented but the result is the value before the action
test3 2 2 n is incremented and since its ++n the new value is the result of the expression
Dennis Richie参与了B和C,并且在这些语言中,大多数疯狂语法如--n
来自。
当谈到功能时,改变它的论点可能并不明智。它使代码更清晰,特别是在递归函数中。因此test1
是最好的,但是如果您希望test3
版本制作变量会使代码更具可读性:
public static int test3(int n)
{
int value = n + 1;
System.out.println(value);
return value;
}
现在这更容易阅读,不是吗?