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
?
我遇到的另一个问题是系统打印是如何运行的,因为我认为当递归部分运行时,它会立即重新启动方法,但似乎整个方法正在运行并循环
答案 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,所以这个recusrsion的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岁的孩子会有一些问题要理解这个:)