[英]JAVA Recursive Program logic
public class Prod {
public static void main(String[] args) {
System.out.println(prod(1, 4));
}
public static int prod(int m, int n) {
if (m == n) {
return n;
} else {
int recurse = prod(m, n-1);
int result = n * recurse;
return result;
}
}
}
運行上面的代碼,我得到24嗎? 我不太明白怎么辦?
我的疑問:1.當m = 1,n = 4時,我們調用prod直到m和n等於1。然后輸出應為n,否則不應執行塊?
有人請幫助我理解邏輯。
只需使用數字進行遍歷,您需要將其寫下來以准確查看其行為(將來,我建議在代碼中添加大量打印內容,以檢查變量以及變量在每次傳遞過程中的變化)。
prod(1,4)
m=1,n=4
m != n so, recurse = prod(1, 3)
prod(1, 3)
m=1,n=3
m != n so, recurse = prod(1, 2)
prod(1, 2)
m=1,n=2
m != n so, recurse = prod(1, 1)
prod(1, 1)
m=1,n=1
m == n so,
return 1
returns to prod(1, 2)
recurse = 1
result = 2 * 1
return 2
returns to prod(1, 3)
recurse = 2
result = 3 * 2
return 6
returns to prod(1, 4)
recurse = 6
result = 4 * 6
return 24
因此,您的程序打印24。
有時,找出程序的最佳方法是機械地逐行執行各個步驟,然后在腦海中(或在紙上追蹤它們)執行它們。
要了解任何帶有函數的程序,您假定被調用函數正確執行了它們的工作,並檢查調用函數是否以正確的順序用正確的參數調用了它們,並正確組合了結果。
對於遞歸函數,您需要檢查每個遞歸調用是否使您更接近沒有遞歸的情況。
在這里,沒有人告訴我們結果應該是什么。 每當m == n
,遞歸結束,並且遞歸調用的n = n - 1
,因此,只有當m <= n
,遞歸調用才有效。
考慮一串電話,每個電話將n
減少1,而m
保持固定。 說n == m + 3
為找出發生的情況:第一個呼叫得到m + 2
,第二m + 1
,第三m
,並返回m
。 第二個取n == m + 1
乘以第三個返回的m
,第二個取n == m + 2
並乘以先前的結果,最后結果為(m + 3) * (m + 2) * (m + 1) * m
。 此函數計算n! / (m - 1)!
n! / (m - 1)!
如果n >= m
。 知道這是怎么回事,很容易檢查我們(到目前為止)的預感是否正確。
prod(1, 4);
public static int prod(int m, int n) {
if (m == n) {
return n;
} else {
int recurse = prod(m, n-1);
int result = n * recurse;
return result;
}
}
可以將m == 1轉換為:
prodA(4);
public static int prodA(int n) {
if (1 == n) {
return n;
} else {
int recurse = prodA(n-1);
int result = n * recurse;
return result;
}
}
具有轉換(頭部遞歸):
public static int prodA(int n) {
int result = 1;
while (n > 1) { // Actually n != 1
result *= n;
--n;
}
return result;
}
這是階乘函數。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.