簡體   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