递归问题缺少乘法

时间:2021-07-05 17:15:49

标签: java

我有这个递归代码

 public static int m(int n1, int n2) {
        int result;   
   if (n2 - n1 == 0) {          
result = n1;      }
 else {
            int mid = (n1 + n2) / 2;
            result = m(n1, mid) * m(mid + 1, n2);
        }
        return result;
    }

但我不明白为什么不执行递归乘法的第二部分,如果我输入参数 (2,3) 结果是 6 但在我下面的计算中是 120

              
                m(2,3)
              mid= 5+2=3
         m(2,3)   *    m(4,5)    
     mid= 2+3/2=2     mid= 4+5/2=4
   m(2,2) * m(3,3)    m(4,4)  * m(5,5)
     
      2     *   3         4   *   5
                  6 * 20
                     120

你能解释一下为什么吗谢谢

2 个答案:

答案 0 :(得分:1)

我认为您在第一步中计算了中间错误。正确的递归树是 -

            m(2,3)
          mid = 2 [=5/2] 
     m(2,2)   *    m(3,3)    
        2     *       3         
              = 6 

答案 1 :(得分:0)

这起初可能会让人感到困惑(当然您可以根据自己的需要进行修改),但有时它有助于:

  • 打印出修改后的变量。
  • 在同一行拆分递归调用以打印出中间结果。
WHERE NAME = NEW.name;

当使用 m(2,5) 运行时,它会打印

public static int m(int n1, int n2) {
    System.out.printf("%nMethod entered: n1 = %d  n2 = %d%n", n1, n2);
    int result;
    int firstCall;
    int secondCall;
    if (n2 - n1 == 0) {
        result = n1;
    } else {
        int mid = (n1 + n2) / 2;
        System.out.printf("mid = %d%n", mid);
        System.out.printf("firstCall =  m(n1 = %d, mid %d)%n", n1,mid);
        firstCall = m(n1, mid);
        System.out.printf("secondCall = m(mid+1 = %d, n2 = %d)%n",mid+1,n2);
        secondCall = m(mid+1,n2);
        System.out.printf("result = firstCall{%d} * secondCall{%d}%n", firstCall, secondCall);
        result = firstCall * secondCall;
        System.out.printf("result = %d%n", result);
    }
    return result;
}