簡體   English   中英

了解此遞歸函數

[英]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的情況,這三種方式是:

  1. 頂部水平1個,下面垂直2個;
  2. 1個水平穿過底部,2個垂直上方;
  3. 或全部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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM