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