首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >eli5无法理解这个递归过程

eli5无法理解这个递归过程
EN

Stack Overflow用户
提问于 2014-01-30 18:13:54
回答 3查看 719关注 0票数 0
代码语言:javascript
复制
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的调用。

输出

代码语言:javascript
复制
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本身?

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 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)返回,等等.整个堆栈

票数 1
EN

Stack Overflow用户

发布于 2014-01-30 18:30:32

在这种情况下,您可以把它想象成一个简单的循环,它只是迭代直到x> 10,所以这个重述的ret值是11,因为它是大于10的第一个数字。因为在递归调用之前没有打印任何值,所以在x变成11之后,函数返回之后,previos堆栈帧包含值x == 10,y 10+ 1,r包含函子=> 11的返回值,对于previos帧和previos .

票数 1
EN

Stack Overflow用户

发布于 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岁的孩子会有一些问题来理解这一点:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21464367

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档