eli5无法理解这个递归过程

时间:2014-01-30 18:13:54

标签: java recursion

public int recursive(int x){
        if(x>10){           
            return x;
        }
        int y = x + 1;
        int r = recursive(y);
        System.out.println(y + " Y" + "  R" + r + "  X " + x);      
        return r;
}

public static void main(String[] args) {
        System.out.println(new a().recursive(1));
}

这是我为简化我无法理解的不同方法所做的递归,但它基本上具有相同的代码行。我不明白这一行int r = recursive(y);发生了什么。我不明白return r;甚至返回什么或它如何主动循环。当我系统打印R时,每次迭代都会使我失去相同的值。如果我更改了返回r to return 555,代码仍然有效但只返回555来自main的调用。

输出

11 Y  R11  X 10
10 Y  R11  X 9
9 Y  R11  X 8
8 Y  R11  X 7
7 Y  R11  X 6
6 Y  R11  X 5
5 Y  R11  X 4
4 Y  R11  X 3
3 Y  R11  X 2
2 Y  R11  X 1
11

请eli5,我已经查看了一些递归视频,但他们没有使用这样的递归,在递归调用后返回。 int r = recursive(y);r如何在此处获取其值,并继续循环,无法弄明白。它表示设置r等于recursive(y)的返回值,但是当r的值尚未设置或其他值时,返回值为r

我遇到的另一个问题是系统打印是如何运行的,因为我认为当递归部分运行时,它会立即重新启动方法,但似乎整个方法正在运行并循环

3 个答案:

答案 0 :(得分:1)

我的朋友在我看来你的递归破坏条件是在r> 10所以它总是打破11这是唯一原因............

假设您传递了x = 1 然后你的递归(1)调用递归(2),递归(2)调用递归(3),递归(3)调用递归(4),递归(4)调用递归(5),递归(5)调用递归(6) ),递归(6)调用递归(7),递归(7)调用递归(8),递归(8)调用递归(9),递归(9)调用递归(10),递归(10)调用递归(11) )

然后递归中断和递归(11)它在这一行返回11`int r = recursive(y);所以r变为11然后递归(10)返回r然后递归(9)返回你是等等.................整个堆栈

答案 1 :(得分:1)

在这种情况下你可以把它想象成一个简单的循环,它只是迭代直到x> 10,所以这个rec​​usrsion的ret值是11,因为它是第一个数字是因为在递归调用之前没有打印,所以在反转顺序中打印值,在x变为11之后,并且函数返回,previos堆栈帧包含值x == 10,y 10 + 1,并且r包含返回值functon => 11,相同的previos框架和previos .....

答案 2 :(得分:1)

当你输入555时,你的函数中的第一个条件是返回值,如果它大于10,所以当555大于10时,它会直接返回值(555)。

现在,对于递归。这很简单,想象一下代码是如何流动的,你输入1作为参数,它是否大于10?不,所以我们转到下一行。我们为y赋值y加1,因此X = 1,Y = 2。

然后我们不再返回一个值,而是再次调用相同的函数,而不是将1作为参数,我们将其称为2作为参数(Y的值)。我们重新开始(这是递归的点),但现在X = 2:2大于10吗?现在,我们转到下一行。我们为Y赋值参数的值(称为X)加1,所以现在Y = 3且X = 2。请记住,变量的范围仅与它们声明的函数相同。

重复此操作,直到参数超过10(每次调用递归函数时加1),最后返回一个值! (在x> 10的情况下),函数完成并将值返回给调用它的函数,这恰好将该值赋给R并打印结果。

依此类推,将每个具有不同值的被调用函数作为参数完成(1,2,3等等,直到10,因为函数每次都向参数添加一个并调用自身)。

我希望这能帮助你更好地理解它,我不知道如何解释这个更简单。我想一个5岁的孩子会有一些问题要理解这个:)