递归思维方法

时间:2017-05-29 16:41:31

标签: java recursion

我知道那里有很多递归教程,但我需要确保我的思维过程是正确的。

1+1=2

0+1=1

1+10=11

2+10=12

2

1

1+10 = 11

2+10 = 12

根据代码,哪一个是正确的思考?

public class recTest {
    //public static int v = 0;

    public static void main(String[] args) {
        System.out.println(test(2));
        //(System.out.println("---");
        //System.out.println(v);
    }

    public static int test (int n) {
        if (n == 0)
            return 10;
        else
            System.out.println(n);
            return test(n-1) + 1;
    }
}

4 个答案:

答案 0 :(得分:1)

第二个选项,因为它首先执行此操作:

System.out.println(n);

然后调用递归方法。

所以,第一次,它只会打印输入参数:2

答案 1 :(得分:1)

据我所知,两者都不正确。

由于println的位置,第二个更正确,但1 + 10和2 + 10不准确,因为你永远不会添加2到10。

当你致电test(2)时,你真的在​​递归通话中返回的11中加1。

你更准确地说:

test(2) -> test(1) + 1 ->           11 + 1 -> 12
test(1) -> test(0) + 1 -> 10 + 1 -> 11
test(0) -> 10          -> 10

或者,如果我们通过扩展将其写出来,它将看起来像:

test(2)
= test(1) + 1
= (test(0) + 1) + 1
= (10 + 1) + 1
= (11) + 1
= 12

答案 2 :(得分:1)

正如我在评论中所说的那样,我不会想到诸如正确的思维和#34;之类的东西。但这是我希望有用的方式:

main calls test(2)
> test(n=2) prints 2
> test(n=2) calls test(1) to compute test(n-1) + 1
> > test(n=1) prints 1
> > test(n=1) calls test(0) to compute test(n-1) + 1
> > > test(n=0) returns 10
> > test(n=1) uses 10 for test(0)
> > test(n=1) computes test(0) + 1 = 10 + 1 = 11
> > test(n=1) returns 11
> test(n=2) uses 11 for test(1)
> test(n=2) computes test(1) + 1 = 11 + 1 = 12
> test(n=2) returns 12
main uses 12 for test(2)
main prints 12

有点冗长,但你可以保留任何有助于你思考的部分。但请注意,正如Trevor所说,它并不能直接在任何地方计算10 + 2。当然,从数学角度来看,它也是一样的,因为+具有交换和关联属性,这意味着你添加一堆东西的顺序并不重要。

答案 3 :(得分:0)

我同意@ThingyWotsit,但只是为了给你提供一个简单的参考,过程将是这样的(数学伪代码):

sysout(test(2));
// test(2) prints: 2

sysout(test(1) + 1);
// test(1) prints: 1

sysout(test(0) + 1 + 1);
sysout(10 + 1 + 1);
sysout(12);
// prints: 12

你应该深入研究调用堆栈原理。