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如何在这里得到它的值,并继续循环,却找不到它。它说set r等于recursive(y)的返回,但是当r的值还没有被设置时,返回本身就是r本身?
我遇到的另一个问题是系统打印是如何运行的,因为我认为当递归部分运行时,它会立即重新启动该方法,但整个方法似乎正在运行和循环。
发布于 2014-01-30 18:23:35
我的朋友,在我看来,你的递归中断条件在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=递归(Y);因此r变为11,然后递归(10)返回r,然后递归(9)返回,等等.整个堆栈
发布于 2014-01-30 18:30:32
在这种情况下,您可以把它想象成一个简单的循环,它只是迭代直到x是> 10,所以这个重述的ret值是11,因为它是大于10的第一个数字。因为在递归调用之前没有打印任何值,所以在x变成11之后,函数返回之后,previos堆栈帧包含值x == 10,y 10+ 1,r包含函子=> 11的返回值,对于previos帧和previos .
发布于 2014-01-30 18:38:57
当输入555时,函数中的第一个条件是返回大于10的值,因此,当555大于10时,它直接返回值(555)。
现在,用于递归。这很简单,想象一下代码是如何流动的,输入1作为参数,它大于10吗?不,所以我们转到下一排。我们给y赋值x+ 1,所以X=1和Y=2。
然后,我们没有返回一个值,而是再次调用相同的函数,但不是1作为参数,而是以2作为参数(Y的值)调用它。我们重新开始(这是递归的点),但是现在X=2: 2大于10吗?现在,我们移到下一行。我们给Y赋值参数(称为X)加上1,所以现在Y=3和X=2。记住,变量的作用域仅在声明的函数中。
重复此操作,直到参数超过10 (每次调用递归函数时添加一个),然后返回一个值!(在x>10的条件下),因此函数完成并将值返回给调用它的函数,后者恰好将该值赋值给R并打印结果。
以此类推,将每个具有不同值作为参数(1、2、3等)的被调用函数完成,直到10,因为该函数每次向参数中添加一个并调用自己。
我希望这有助于你更好地理解它,我不知道如何解释这个更简单。我想一个5岁的孩子会有一些问题来理解这一点:)
https://stackoverflow.com/questions/21464367
复制相似问题