[英]What is the return value of a recursive call
java version "1.8.0_92"
我有以下代码正在尝试理解和跟踪。
我不明白的部分是* a
结尾。 乘法何时被调用? power1(a, n - 1);
的返回值是多少power1(a, n - 1);
是n - 1 * a
public static double power1(double a, int n) {
double result;
if(n == 0) {
return 1;
}
else {
result = power1(a, n - 1) * a;
return result;
}
}
您可以修改代码以打印递归的痕迹。 那可以帮助您了解发生了什么。
/**
* Print string form of `o`, but indented with n spaces
*/
private static void printIndented(int n, Object o) {
while (n-->0) System.out.print(" ");
System.out.println(o);
}
/*
* Added a third param `d` to keep track of the depth of the recursion
*/
public static double power1(double a, int n, int d) {
// Entering a "possible" recursive call
printIndented(d, "call power1, a=" + a + ", n=" + n + ", d=" + d);
double result;
if(n == 0) {
// Returning from the base case, this should have the largest depth.
printIndented(d, "return 1.0");
return 1;
}
else {
result = power1(a, n - 1, d + 1);
// Return from intermediate recursive calls, we print
// the value of power1(a, n-1) as well.
printIndented(d, "return " + result + " * " + a);
return result * a;
}
}
public static void main(String [] args) {
System.out.println(power1(1.4, 3, 0));
}
输出量
call power1, a=1.4, n=3, d=0
call power1, a=1.4, n=2, d=1
call power1, a=1.4, n=1, d=2
call power1, a=1.4, n=0, d=3
return 1.0
return 1.0 * 1.4
return 1.4 * 1.4
return 1.9599999999999997 * 1.4
2.7439999999999993
如您所见,内部return的值成为外部return语句的result
。
我们可以看到public static _double_ power1(double a, int n)
被定义为public static _double_ power1(double a, int n)
这意味着
result = power1(a, n - 1) * a;
类型将是:
double = double * double;
我们从n
和a
开始我们的功能。 在此实现中, a
将保持不变。 直接给出下一个递归调用。
但是n
有所不同。
我们称power1(a,n)
。 它首先检查n == 0。 它不是。 因此,我们转到if的else部分。 计算result
时间。
要知道result
的值是什么,我们需要power1(a,n-1)。 我们继续。 n-1可以为0或不能为0。
如果为0,则返回1,现在知道power1(a,n-1)=1。我们现在可以将其乘以a。
如果它不为0,那么我们需要一个新的结果,因为我们正在完全分开调用power1
方法。 现在我们需要power1(a,n-2)。 我们再次检查0。如果n-2 == 0,则返回1以使调用方计算出power(a,n-1)。 如果不接听另一个电话,现在使用n-3 ...等
在进行n次乘法之前,它将首先调用所有(n)个递归调用。
如果使用a = 2
和n = 3
调用power1,则会发生以下情况:
result = power1(2, 2) * 2;
power1(2, 2) = power1(2, 1) * 2;
power1(2, 1) = power1(2, 0) * 2;
power1(2, 0) = 1
在上面的示例中, * a
总共发生3次。 只要power1(a,n)返回一个值,就会调用它。 返回值的第一个power1(a, n)
将是power1(2, 0)
(这是因为n = 0
是您的“基本”情况)。 然后power1(2, 1)
将返回2。然后power1(2, 2)
将返回4。然后您对power1(2, 3)
初始调用将返回8。
首先,将幂(a,n-1)称为n == 0,这是您的基本情况。
然后返回1并乘以a的值。 然后,将a返回到上一个调用,在此将其乘以a。 该过程重复N次,因此得到A ^ n。 我建议您仔细阅读该代码的一个示例,为它提供一些初始值,并使用笔和纸来跟踪代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.