[英]Understanding this recursive function
各位程序員大家好。
一段時間以來,遞歸編程一直是我最不了解的事情之一。 因此,我決定需要花費一些時間,了解並編寫一些基本示例。 問題是我已經解決了這項任務,但不太了解它是如何工作的-.-
如果有人可以幫助我理解它,我將不勝感激。
提前致謝。
分配:
一個多米諾骨牌的大小為2 * 1。 一塊木板的長度為n,寬度為2。創建一個遞歸方法以返回路數,而一塊木板可以用多米諾骨牌覆蓋。
我的方法:
public static int dominobrik(int n){
int sum;
if(n >= 0 && n <= 2){
sum = n;
} else {
sum = dominobrik(n-1) + dominobrik(n-2);
}
return sum;
}
為了幫助人們理解這種遞歸調用,我真的認為很好地打印出內容確實有幫助。
程序的輸出已根據遞歸深度縮進。
在執行以下操作時,以下是達到所有解決方案(寬度為5)的8條路徑:
dominobrik(n-2) + dominobrik(n-1)
(請注意,對於每個新路徑,如果可能,遞歸調用首先將兩個水平部分相加)
(還請注意,這與您發布的代碼不同,您先編寫(n-1),然后編寫(n-2),但實際上並沒有太大變化)
So far the board is:
.....
.....
So far the board is:
--...
--...
So far the board is:
----.
----.
Finished board:
----|
----|
So far the board is:
--|..
--|..
Finished board:
--|--
--|--
So far the board is:
--||.
--||.
Finished board:
--|||
--|||
So far the board is:
|....
|....
So far the board is:
|--..
|--..
Finished board:
|----
|----
So far the board is:
|--|.
|--|.
Finished board:
|--||
|--||
So far the board is:
||...
||...
So far the board is:
||--.
||--.
Finished board:
||--|
||--|
So far the board is:
|||..
|||..
Finished board:
|||--
|||--
So far the board is:
||||.
||||.
Finished board:
|||||
|||||
在n = 1
的基本情況下,只有一種方法可以將多米諾骨牌放置在板上,並且水平放置。 當n = 2
,有2種方式排列多米諾骨牌。 您既可以垂直排列,也可以水平排列。
對於n = 3
的情況,這三種方式是:
請注意,在n = 3
情況下,您重復了n = 2
情況的兩種排列,但是在這些情況下,您從n = 1
情況中添加了排列。 回想一下, n = 1
的唯一有效排列是單個水平多米諾骨牌。 n = 3
每種情況均具有至少1個水平多米諾骨牌。
您可以將其擴展到n = 4
情況。 對於n = 3
,采用上述所有可能的組合,然后將n = 2
所有組合相加,並根據問題的約束適當地堆疊它們。
我希望我能舉例說明,但這可能有助於將它們畫在方格紙上。
不要說您知道n
的答案,而您想要n + 1
的答案。
對於n
某些解決方案,您擁有最后一個多米諾骨牌垂直站立,而對於其他解決方案,最后兩個多米諾骨牌水平地堆疊在一起。
如果最后兩個多米諾骨牌是水平的,您所能做的就是垂直添加n + 1
多米諾骨牌。 但是,如果最后一個多米諾骨牌是垂直的,那么您也可以垂直添加它,也可以與前一個多米諾骨牌一起水平翻轉。
我不僅要跟蹤給定n
,還要跟蹤最后一個水平/垂直的多米諾骨牌終止的解。
由於這是家庭作業,我讓您找出其余的內容。 另外我還沒有真正找到完整的解決方案。 結果可能與您發布的解決方案相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.