5 回答

TA貢獻1936條經(jīng)驗 獲得超7個贊
實際上,您可以逐步完成此過程,想象沿途每一步 n是什么。
也許最重要的一點是,當(dāng)遞歸達到 1-case 時,它會打印“ AB ”,但即使它不在 1-case 中,它也會在第一次調(diào)用自身后打印A ,在調(diào)用自身后打印B第二次。因此,當(dāng)我們調(diào)用 2 時,我們期望先出現(xiàn) 1 種情況(“ AB ”),然后是“ A ”,然后是 1 種情況(“ AB ”),然后是“ B ”?;颉?ABAABB ”
testMethod(2) {
--testMethod(1) {
----testMethod(0);
----System.out.print("A");
----testMethod(0);
----System.out.print("B");
--}
--System.out.print("A");
--testMethod(1) {
----testMethod(0);
----System.out.print("A");
----testMethod(0);
----System.out.print("B");
--}
-- System.out.print("B");
}
如果您按順序瀏覽打印內(nèi)容,那么您將得到此輸出是有意義的。

TA貢獻1884條經(jīng)驗 獲得超4個贊
關(guān)鍵是要記住,一旦調(diào)用遞歸,子調(diào)用中的所有指令都會在父調(diào)用中的其余指令執(zhí)行之前執(zhí)行。代碼中有兩次對 (n-1) 的遞歸調(diào)用,每次打印之前一次。
讓我們嘗試可視化 testMethod(2) 的調(diào)用堆棧:n=2 > 0,則主堆棧為:
1. testMethod(1); // 2- 1
2. System.out.print("A");
3. testMethod(1); // 2 - 1
4. System.out.print("B");`
現(xiàn)在讓我們考慮子調(diào)用 testMethod(1) n=1 > 0, stack for testMethod(1); =>
testMethod(0); // 1-1
System.out.print("A");
testMethod(0); // 1 -1
System.out.print("B");`
由于測試方法(0);不執(zhí)行任何操作( 0 不 > 0)我們可以刪除 testMethod(0) 以簡化 testMethod(1) 的堆棧;=>
System.out.print("A");
System.out.print("B");`
現(xiàn)在讓我們將其替換回主堆棧中的 testMethod(2) =>
1.1 System.out.print("A");//-----
//-----> testMethod(1)
1.2 System.out.print("B");`//----
2. System.out.print("A");
3.1 System.out.print("A");//-----
//-----> second testMethod(1)
3.2 System.out.print("B");`//----
4. System.out.print("B");`
然后按 ABAABB 的順序打印出來

TA貢獻1844條經(jīng)驗 獲得超8個贊
如果您熟悉樹結(jié)構(gòu)及其遍歷,那么理解任何遞歸方法的工作過程就會容易得多。對于此方法,遞歸樹將如下所示:
對于 n=2,完整的樹如下:
現(xiàn)在您需要從左到右遍歷樹(基于中序,僅葉子),您將得到:
打?。ā癆”) 打?。ā癇”) 打印(“A”) 打?。ā癆”) 打印(“B”) 打?。ā癇”)
這是:ABAABB

TA貢獻1854條經(jīng)驗 獲得超8個贊
假設(shè)您的代碼行是
public static void testMethod(int n) {
if (n > 0) {
testMethod(n - 1); /* line1 */
System.out.print("A"); /* line2 */
testMethod(n - 1); /* line3 */
System.out.print("B"); /* line4 */
} /* line5 */
}
然后你需要執(zhí)行以下步驟:
1. n=2: line1 -> testMethod(n=1)
2. n=1: line1 -> testMethod(n=0)
3. n=0: line5 -> return
4. n=1: line2 -> prints "A"
5. n=1: line3 -> testMethod(n=0)
6. n=0: line5 -> return
7. n=1: line4 -> prints "B"
8. n=1: line5 -> return
9. n=2: line2 -> prints "A"
10. n=2: line3 -> testMethod(n=1)
11. n=1: see 2-8
... n=1: prints "AB"
18. n=2: line4 -> prints "B"
19. n=2: line5 -> return

TA貢獻1845條經(jīng)驗 獲得超8個贊
所以第一個testMethod是用2調(diào)用的。它檢查是否 2 > 0 -> true
現(xiàn)在讓我們說得更清楚testMethod1是用1調(diào)用的 ,它檢查是否 1 > 0 -> true
現(xiàn)在使用0調(diào)用testMethod2。
0 > 0 -> false 這個調(diào)用什么也不做,所以回到testMethod1
testMethod1打印 A用0調(diào)用testMethod3,所以什么也沒有發(fā)生,然后再次 返回testMethod1 testMethod1打印 B 現(xiàn)在我們回到原來的testMethod調(diào)用
A 被打印,現(xiàn)在我們再次做同樣的事情,所以 AB 被打印,最后 B
添加回答
舉報