[英]Result of recursive method
我試圖理解這種遞歸方法,但是即使使用調試器,我也無法解決對我來說有意義的事情,因此我希望這里的人有動力向我解釋這里的情況。 我知道遞歸的工作原理,但是寫下這種方法的方式困擾着我。 我知道Java中的條件運算符,我編寫了一個新代碼,但是仍然不明白,所以我期望這里是。
m(5)和m(15)的結果是什么。 您是如何計算的? 謝謝
答案后編輯。 我整理了一張表格,供以后的讀者參考
m(n)::|0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|...
result|0|0|1|1|1|2|3|4|6|9|13|19|28|41|60|88|...
我只用程序檢查了15的結果。
public class practice {
/**
* Try to understand the way this works
* @param n
* @return
*/
static long m(long n) {
return n <= 1 ? 0 : n == 2 ? 1 : m(n - 1) + m(n - 3);
}
/**
* This is what i tried so far.
* @param n
* @return
*/
static long ma(long n) {
System.out.println("Method called");
System.out.println("N is: " + n);
if (n <= 1) {
System.out.println("N<=1: " + n);
System.out.println("0 is returned");
return 0;
} else if (n == 2) {
System.out.println("N==2: " + n);
System.out.println("1 is returned");
return 1;
} else {
System.out.println("Inside ELSE, N is: " + n);
return ma(n - 1) + ma(n - 3);
}
}
public static void main(String[] args) {
ma(15);
}
}
用這種方式編寫它,使它更易於理解:
m(0) = 0
m(1) = 0
m(2) = 1
m(n) = m(n - 1) + m(n - 3) // n >= 3
當我們知道m(0)
, m(1)
和m(2)
,我們可以使用m(n - 1) + m(n - 3)
計算任何m(n)
,其中n >= 3
。 對於任何負輸入,結果均為0。
例如:
m(3) = m(3 - 1) + m(3 - 3) = m(2) + m(0) = 1 + 0 = 1
m(4) = m(4 - 1) + m(4 - 3) = m(3) + m(1) = 1 + 0 = 1
m(5) = m(5 - 1) + m(5 - 3) = m(4) + m(2) = 1 + 1 = 2
等等...
鉛筆和紙是您的朋友。
有3種情況(其中兩種是基本情況)
if n <= 1 then return 0
if n == 2 then return 1
else recursive call to m(n-1) + m(n-3)
因此,您知道在每個遞歸調用中,我們都接近基本條件之一。
這是m(5)
發生的堆棧跟蹤
m(5)
m(4) + m(2)
m(3) + m(1) return 1
m(2) + m(0) return 0
return 1 return 0
將所有收益相加得出1 + 0 + 0 + 1
,即2
所以
m(5) == 2
偽代碼中的方法m
。 (這是某種scala / python混搭)
def m (number n)
if (n <= 1) 0
else if (n == 2) 1
else m(n - 1) + m(n - 3)
查看此內容,您可以看到<= 2
任何內容都是終端操作,根據輸入返回0
或1
。 如果n
> 2,則樂趣開始。 以n=3
為例。 由於3
大於2
,因此我們需要運行第三個if
。 當我們看那條線時,我們看到nee返回m(n - 1) + m(n - 3)
。 插入n = 3
后,它看起來像是: m(3 - 1) + m(3 - 3)
,或更簡單地說,是這樣的: m(2) + m(0)
。 現在這將以1
終止,因為n
2
或0
都不會導致m
更多調用。
現在我們有了一些了解,現在我們可以鍛煉m(15)
和m(5)
會返回什么。
我只會計算5
因為15
的調用棧會很長
m(5)
/ \
m(5-1) + m(5-3)
/ \ |
m(4-1) + m(4-3) |
/ \ | |
m(3-1) + m(3-3) | |
| | | |
1 + 0 + 0 + 1
2
希望能幫助到你!
m(5) = m(4)+m(2) // 5>2, so the third condition
m(4) + m(2) = m(3)+m(1) + 1 // 4>2, so the third condition
m(3) + m(1) + 1 = m(2)+m(0) + 0 + 1 // 3>2, so the third condition
m(2) + m(0) + 0 + 1 = 1 + 0 + 0 + 1 = 2
現在,在轉換之間, m(2)
立即替換為1
,而m(n<=1)
立即替換為0
。 這就是您可以在紙上進行分析的方式。 但是,計算機在計算m(2)
並將結果加到第一行之前會先計算m(4)
-發生這種情況是由於遞歸函數中的插補順序。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.