递归调用的返回值是什么

时间:2016-11-21 22:42:16

标签: java recursion

java version "1.8.0_92"

我正在尝试理解和跟踪以下代码。

我不理解的部分是最后的* a。这个乘法什么时候被调用? 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;
        }
    }

4 个答案:

答案 0 :(得分:4)

您可以修改代码以打印递归的跟踪。这可以帮助您了解正在发生的事情。

/**
 * 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

如您所见,内部返回值中的值变为外部返回语句中的result

答案 1 :(得分:3)

power1(a,n-1)

的返回值

我们可以看到power1定义为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,我们返回1,现在我们知道power1(a,n-1)= 1.我们现在可以将它乘以。

如果它不是0,那么我们需要一个新结果,因为我们正在完全单独调用power1方法。我们现在需要power1(a,n-2)。我们再次检查0.如果n-2 == 0,则返回1以使调用者计算功率(a,n-1)。如果不是另一个电话,现在用n-3 ......等等

就调用乘法的时间而言。

在进行n次乘法之前,它会首先调用所有(n)递归调用。

答案 2 :(得分:2)

如果您使用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总共发生了三次。只要power1(a,n)返回一个值,就会调用它。返回值的第一个power1(a, n)将为power1(2, 0)(这是因为n = 0是您的“基础”案例)。然后power1(2, 1)将返回2.然后power1(2, 2)将返回4.然后,您对power1(2, 3)的初始调用将返回8.

答案 3 :(得分:0)

首先你打电话给权力(a,n-1)直到n == 0,这是你的基本情况。

然后返回1并乘以a的值。 然后a返回到前一个调用,并乘以a。该过程重复N次,因此得到A ^ n。我建议你通过这个代码的一个例子给它一些首字母值并用笔和纸描述代码。