請在下面的代碼中解釋遞歸語句的工作原理。Java中的遞歸它如何工作?
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1) * n;
return result;
}
我的理解是:
在上面的語句factR(n-1)
方法調用本身,直到結束。假設我們想得到6的階乘,它將作爲參數發送給這個方法。它將被接收作爲參數n
,然後的n
值將被檢查;如果它是1,那麼將返回1。但如果它不是1,就像我們的情況那樣,它是6,那麼遞歸語句就會運行。
現在我面臨的問題是,第一次n-1
變成5並且乘以n,保持值6,那麼它變成30.現在30那裏去哪裏?
然後該方法將自行調用,此時n-1
變爲4,然後乘以n
,其中IF保持值「6」,然後是4 * 6 = 24,我認爲這是錯誤的。因爲如果我們通過這種方式然後在下次調用 過程將會像,n-1
將成爲3 * n的IF保持相同的值,即6,然後它會成爲3×6 = 18,然後出現下一個電話和n-1
變爲2,如果我們相乘並假設n
保持值6然後2 * 6 = 12,並在最後一次調用n-1
= 1 * N = 6,我的意思是很清楚,n-1
將減小值n-1
即6-1 = 5然後5-1 = 4然後4-1 = 3然後3-1 = 2和2-1 = 1。但問題是,當方法調用它時,每次都會乘以n
的值是多少?
如果說的是,當第一乘法發生即,「N-1」成爲5然後由6 = 30乘以和30被存儲在「n」個則在下一呼叫5-1 = 4 * 30 = 120 ,然後4-1 = 3 * 120 = 360,然後3-1 = 2 * 360 = 720,和最後1 * 720 = 720然後如何爪哇確定把所得到的值返回到可變n
?
如果我把另一個語句來檢查什麼是可變result
的值每次方法調用本身以這種方式,就像這樣:
int factR(int n) {
int result;
if(n==1) return 1;
result = factR(n-1)*n ;
System.out.println(result);
return result;
}
然後我得到這樣的輸出:
2
6
24
120
720
Factorial of 6 is 720
我不明白它在第一次調用時如何產生2。價值2,然後6,24,120和720從哪裏來?我認爲我在代碼的工作中受到嚴重阻礙。
您是否嘗試調試代碼? – TheLostMind
你是錯誤的方式。在你的情況下,它不會首先得到'30'。它將以'1 * 2'開始 - >將結果傳遞給調用者methot'* 3' - >將結果傳遞給調用方法'* 4',依此類推。遞歸調用的每次調用都被放到堆棧上,當堆棧到達不進行任何進一步遞歸的地步時,該堆棧從頂部(最後一個調用)一直回到底部(第一個調用)。 – SomeJavaGuy
2不是第一個電話,是第2個電話,它只是你的第一個電話在返回println之前做的返回。 – valepu