将输出解释为递归示例

时间:2016-02-19 00:48:47

标签: java recursion

有人可以解释为什么输出为6?我真的不明白为什么。

public class blah {
    public static int blah( int n, int m){
      if (m ==0 || n==m || n==2)
         return 1;
      else if (m>n)
         return 0;
      else 
         return blah(n-1,m-1) + blah(n-1,m);
    }
    public static void main(String [] args){
        System.out.println (blah(7,6));
    }

}

据我所知,输出应该是

(6,5)+(6,6)
(5,4)+(5,5)
(4,3)+(4,4)
(3,2)+(3,3)
(2,1)+(2,2)---->2
(1,0)+(1,1)---> 2
=4?

2 个答案:

答案 0 :(得分:4)

实际分辨率看起来更接近于此(请记住,如果n==m然后blah(n,m)返回1):

(7,6)
(6,5) + (6,6)=1
(5,4) + (5,5)=1 + 1
(4,3) + (4,4)=1 + 1 + 1
(3,2) + (3,3)=1 + 1 + 1 + 1
(2,1)=1 + (2,2)=1 + 1 + 1 + 1 + 1
1 + 1 + 1 + 1 + 1 + 1

哪个是==6

答案 1 :(得分:3)

我采取了简单的调试步骤,在进入例程,参数和退出结果时打印参数。这里有你的踪迹。你能从这里拿走吗? @mech很好地确定了基本原理:m = n的每个情况都返回另一个要添加的1,并且那些从(6,6)向下运行到(2,2)。为案例(2,1)添加返回的1,你就得到了答案。

           n m result
ENTER blah 7 6
ENTER blah 6 5
ENTER blah 5 4
ENTER blah 4 3
ENTER blah 3 2
ENTER blah 2 1
LEAVE blah 2 1 1
ENTER blah 2 2
LEAVE blah 2 2 1
LEAVE blah 3 2 2
ENTER blah 3 3
LEAVE blah 3 3 1
LEAVE blah 4 3 3
ENTER blah 4 4
LEAVE blah 4 4 1
LEAVE blah 5 4 4
ENTER blah 5 5
LEAVE blah 5 5 1
LEAVE blah 6 5 5
ENTER blah 6 6
LEAVE blah 6 6 1
LEAVE blah 7 6 6