【问题标题】:eli5 can't understand this recursion processeli5 看不懂这个递归过程
【发布时间】:2014-01-30 18:13:54
【问题描述】:
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 时,每次迭代总是相同的值让我失望。如果我更改 return 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本身?

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

【问题讨论】:

  • 只是好奇。 eli5 是什么?
  • 对不起,像我 5 岁一样解释的缩写
  • 你能把这个过程写在一张纸上,告诉我们你有什么,你在哪里卡住了吗?
  • 我试过画它,但实际上不知道从哪里开始这个 int r = recursive(y);。我以为 r 会是 2>3>4>5...但它始终是最后一个值,即 11
  • 用调试器运行一下就明白了。

标签: java recursion


【解决方案1】:

我的朋友,在我看来,你的递归中断条件是 r>10,所以它总是在 11 处中断,这是唯一的原因............

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

然后递归中断并在 recursive(11) 处返回 11 在这一行 `int r = recursive(y);所以 r 变为 11,然后 recursion(10) 返回你 r 然后 recursion(9) 返回你是,依此类推........整个堆栈

【讨论】:

  • 是什么原因?我要求解释这个递归是如何工作的,而不是结果是什么
  • 必须有破坏条件
  • 我知道,但这是回答@Thrash Bean的唯一原因
  • @Catz n Dogz,我的朋友,我已经编辑了我的帖子并附有详细解释,它会给你清晰的图片
  • 它好多了,谢谢,但我不明白递归中断后的部分以及它是如何倒退的。我知道我现在是如何获得 r 的,但在那之后,每次递归运行时它都会打印一个系统,但我看不到过程/逻辑/原因。至少现在我明白 r 来自哪里
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    当你输入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 岁的孩子在理解这个方面会有一些问题:)

    【讨论】:

    • 谢谢,这肯定澄清了我如何获得 R 值,但仍然让我想知道如果递归每次都应该重新启动该方法,系统打印实际上是如何打印的。 '完成每个具有不同值作为参数的被调用函数(1、2、3 等,直到 10,因为函数每次都向参数添加一个并调用自身)'这部分可能就是为什么我仍然是对感到困惑
    • 哦,那是因为你第一次打破条件时,Y 的值为 11(这就是它停止重复的原因),所以它开始打印这些值,然后返回 R 的值,这也是 11。在它返回那个值之后,我们移动到调用这个的函数,其中 Y 的值为 10,我们打印结果,并将值返回给调用函数......等等......
    • 好吧,我想我终于明白了,但可以肯定的是,它会返回 11 给所有以前的调用者吗?又名 r = 递归(2); r 会得到 11 吗?希望我是对的>
    • 是的,除非你传递一个高于 11 的参数(第一个打破第一个条件的值),否则你总是会得到 11,如果你输入一个更高的值,那么这个相同的值将是结果。我想你明白了:)
    猜你喜欢
    • 1970-01-01
    • 2017-11-20
    • 1970-01-01
    • 1970-01-01
    • 2017-10-13
    • 2014-04-10
    • 2023-03-28
    • 1970-01-01
    • 2023-03-10
    相关资源
    最近更新 更多