理解这个递归函数

时间:2012-01-17 14:03:05

标签: java recursion

Hello其他程序员。

一段时间以来,递归编程一直是我最不了解的事情之一。因为我决定,我需要花一些时间,理解和编程一些基本的例子。问题是我已经解决了这个任务,但是不太明白它的工作原理-.-

如果有人能帮我理解,我会很感激。

提前谢谢。

  • Teilmann

分配:

一个主要的大小为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;

}

3 个答案:

答案 0 :(得分:4)

为了帮助人们理解这种递归调用我真的认为很好地打印出来的东西确实有帮助。

程序的输出已根据递归深度缩进。

在执行以下操作时,以下是达到宽度为5的所有解决方案所采用的8条路径:

dominobrik(n-2) + dominobrik(n-1)

(请注意,对于每个新路径,如果可能,递归调用首先会添加两个水平部分)

(另请注意,这与您发布的代码不同,您首先编写(n-1)然后编写(n-2),但实际上并没有太大变化) < / p>

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:
                         |||||
                         |||||

答案 1 :(得分:1)

n = 1的基本情况下,只有一种方法可以将多米诺骨牌排列在棋盘上,而这是水平的。在n = 2,有两种方法来安排多米诺骨牌。您可以垂直排列,也可以水平排列。

对于n = 3的情况,有3种方式:

  1. 横向顶部1个,垂直下部2个;
  2. 横向底部1个,垂直上部2个;
  3. 或全部3个水平,堆叠。
  4. 请注意,在n = 3案例中,您已重复n = 2案例的两种安排,但对于这些案例,您已添加了n = 1案例中的安排。回想一下,n = 1唯一有效的安排是单个水平多米诺骨牌。 n = 3中的每个案例至少有一个水平多米诺骨牌。

    您可以将此扩展到n = 4案例。对n = 3进行上述所有可能的组合,然后添加n = 2的所有组合,根据问题的约束适当地叠加它们。

    我希望我可以说明这一点,但可能有助于在一些方格纸上画出来。

答案 2 :(得分:1)

不要说你知道n的答案,而你想要n + 1的答案。

对于n的一些解决方案,你有最后一张垂直的多米诺骨牌,而对于其他的,最后两个多米诺骨牌水平堆叠在一起。

如果最后两个多米诺骨牌是水平的,你所能做的就是垂直添加你的n + 1多米诺骨牌。但是,如果最后一张多米诺骨牌是垂直的,那么你也可以垂直添加它,或者你可以用之前的多米诺骨牌水平翻转它。

我不仅要跟踪给定n有多少解决方案,还要跟踪有多少解决方案以最后一个多米诺水平/垂直方式终止。

我会让你弄清楚剩下的,因为这是作业。我还没有真正找到完整的解决方案。它可能会与您发布的解决方案等效。