了解此递归方法的工作原理
Understanding how this recursive method works
谁能解释一下这个方法是如何工作的?
我尝试添加 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);
}
编辑:我意识到我从错误的角度看待这个方法(不知道这是怎么发生的,但确实发生了),在恐慌的时刻,我决定征求群众的智慧。
对此的解释非常清晰简洁,一般来说也是关于递归的,这就是为什么我想保持 post 而不是删除我的愚蠢时刻。
该方法将 x
乘以 1 + y
n
次。换句话说,该方法将 return x*(1+y)^n
最后。这是原定的n > 0
。如果n
原本小于0,则该方法会无限递归。
说明:当方法“进入”递归并调用自身时,它将执行 n
次,因为我们将 n
减 1 直到 n
等于 0。当n
最终到达0,递归的最内层调用会returnx
。每次连续调用都会将前一次调用的输出乘以 1+y
。
这不是你算法的图片,但它可以帮助你理解递归调用的概念。
右侧是调用顺序(从上到下),左侧是 return 次(从下到上)。
方法使用 n-1
参数调用自身。
注意,您有一个 基本案例 ,即 n==0
;
现在注意,当一个特定的方法开始执行时,在某个时候,它会调用它自己的另一个实例,但是更小的n;
这个调用你自己的模式每次都少一个n,直到你达到你的基本情况;
当调用堆栈达到 n==0
基本情况时,方法调用将开始展开:last 将 return,这将使 previous-to-last 到 return,依此类推,直到您第一次调用 returns 和方法 returns.
这种调用行为称为后进先出 (LIFO)。
由于无法发表评论,所以我尝试这样回答问题。
如果跟不上代码调试,请尝试手动调试。
假设我们有以下值:
| × |是 | n |
| 5 | 2 | 2 |
现在用这些值调用方法并在脑海中播放它。
由于在第一步中 n 不为 0,因此它将使用 n-1 再次调用该方法。只要 n 等于 0,就会重复此操作。对于每个嵌套调用,您需要将结果与 (y-1) 相乘。所以上面的值的方式是:
`>初始调用:递归(5, 2, 2) -> n != 0
Rec call 1-> recursive(5, 2, 1) * (3) -> n != 0
Rec call 2-> recursive(5, 2, 0) * (3) -> n == 0
return x -> return 5`
现在您需要倒退计算 53 = 15(Return rec Call 1 的值)。这个结果你需要重新计算所以我们有 15 3 = 45 作为初始方法的结果。
希望你能搞清楚方法的真正作用
谁能解释一下这个方法是如何工作的?
我尝试添加 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);
}
编辑:我意识到我从错误的角度看待这个方法(不知道这是怎么发生的,但确实发生了),在恐慌的时刻,我决定征求群众的智慧。
对此的解释非常清晰简洁,一般来说也是关于递归的,这就是为什么我想保持 post 而不是删除我的愚蠢时刻。
该方法将 x
乘以 1 + y
n
次。换句话说,该方法将 return x*(1+y)^n
最后。这是原定的n > 0
。如果n
原本小于0,则该方法会无限递归。
说明:当方法“进入”递归并调用自身时,它将执行 n
次,因为我们将 n
减 1 直到 n
等于 0。当n
最终到达0,递归的最内层调用会returnx
。每次连续调用都会将前一次调用的输出乘以 1+y
。
这不是你算法的图片,但它可以帮助你理解递归调用的概念。
右侧是调用顺序(从上到下),左侧是 return 次(从下到上)。
方法使用 n-1
参数调用自身。
注意,您有一个 基本案例 ,即
n==0
;现在注意,当一个特定的方法开始执行时,在某个时候,它会调用它自己的另一个实例,但是更小的n;
这个调用你自己的模式每次都少一个n,直到你达到你的基本情况;
当调用堆栈达到
n==0
基本情况时,方法调用将开始展开:last 将 return,这将使 previous-to-last 到 return,依此类推,直到您第一次调用 returns 和方法 returns.
这种调用行为称为后进先出 (LIFO)。
由于无法发表评论,所以我尝试这样回答问题。
如果跟不上代码调试,请尝试手动调试。 假设我们有以下值:
| × |是 | n |
| 5 | 2 | 2 |
现在用这些值调用方法并在脑海中播放它。 由于在第一步中 n 不为 0,因此它将使用 n-1 再次调用该方法。只要 n 等于 0,就会重复此操作。对于每个嵌套调用,您需要将结果与 (y-1) 相乘。所以上面的值的方式是:
`>初始调用:递归(5, 2, 2) -> n != 0
Rec call 1-> recursive(5, 2, 1) * (3) -> n != 0
Rec call 2-> recursive(5, 2, 0) * (3) -> n == 0 return x -> return 5`
现在您需要倒退计算 53 = 15(Return rec Call 1 的值)。这个结果你需要重新计算所以我们有 15 3 = 45 作为初始方法的结果。
希望你能搞清楚方法的真正作用