繁体   English   中英

递归调用的返回值是多少

[英]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

power1(a,n-1)的返回值

我们可以看到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;

当乘法被调用时

我们从na开始我们的功能。 在此实现中, 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 = 2n = 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM