递归调用

时间:2016-05-21 20:31:11

标签: java recursion

我需要有人告诉我这两个代码之间的区别:

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

4 个答案:

答案 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)

递归调用中的--xx-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;
}

现在这更容易阅读,不是吗?