了解这种递归方法的工作原理

问题描述

有人可以解释一下这种方法是如何工作的吗? 我尝试添加 System.out.print 语句,但它并没有让我在任何地方 我现在似乎无法理解它。

public static double recursive(double x,double y,int n) {

    if(n==0) {
        return x;
    }

    return recursive(x,y,n-1) * (1+y);
}

编辑:我意识到我从错误的角度看待这种方法(不确定这是怎么发生的,但确实发生了)并且在恐慌的时刻我决定寻求群众的智慧。

对此的解释非常清晰简洁,也涉及一般的递归,这就是为什么我想保留帖子而不是删除我的愚蠢时刻。

解决方法

该方法将 x 乘以 1 + y n 次。换句话说,该方法最终将返回 x*(1+y)^n。这是给定的原始 n > 0。如果 n 最初小于 0,则该方法将无限递归。

说明:当方法“进入”递归并调用自身时,它将这样做 n 次,因为我们将 n 减 1 直到 n 等于 0。当 {{ 1}} 最终达到 0,最内层的递归调用将返回 n。每次连续调用都会将前一次调用的输出乘以 x

,

由于无法发表评论,我尝试以这种方式回答问题。

如果不能按照代码调试,尝试手动进行。 假设我们有以下值:
| × |是 | n |
|:--|:--|:--| | 5 | 2 | 2 | 现在用这些值调用方法并在你的脑海中播放它。 由于 n 在第一步中不是 0,它会用 n-1 再次调用方法。当 n 等于 0 时,重复此操作的频率。对于每个嵌套调用,您需要将结果与 (y-1) 相乘。所以上述值的方式是:

`>初始调用:recursive(5,2,2) -> n != 0

Rec call 1-> recursive(5,1) * (3) -> n != 0

Rec call 2-> recursive(5,0) * (3) -> n == 0 返回 x -> 返回 5`

现在您需要向后计算 53 = 15(rec Call 1 的返回值)。这个结果你需要重新计算,所以我们有 15 3 = 45 作为初始方法的结果。

希望你能弄清楚方法的真正作用。

,

这不是您算法的图片,但它可以帮助您理解递归调用的概念。

右侧有调用顺序(从上到下),左侧有返回顺序(从下到上)。

方法使用 n-1 参数调用自身。

enter image description here

  1. 请注意,您有一个基本情况,即 n==0;

  2. 现在请注意,当一个特定方法开始执行时,在某个时刻,它会调用自身的另一个实例,但是较小的 n;

  3. 这个调用自己的模式每次都少一个 n,直到你达到你的基本情况;

  4. 调用堆栈达到 n==0 基本情况的那一刻,方法调用将开始展开:last 将返回,这将使前一个到最后一个返回,依此类推,直到您的第一次调用返回和方法返回。

这种调用行为称为后进先出 (LIFO)。