如何递归计算两个数的乘法

时间:2016-03-10 23:39:12

标签: java recursion

我正在阅读Java中的递归。我在课程页面中找到了这个例子,用于递归计算两个数字的乘法:

public class bst {

    public static void main(String[] args) {
        bst b = new bst();
        b.mult(2, 4);
        System.out.println(b.mult(2, 4));
    }

    public static int mult(int a, int b) {
        if (b == 0) {
            return 0;
        } else {
            return a + mult(a, b - 1);
        }
    }
}

我使用调试来查看它是如何工作的,但我仍然不明白它如何计算2*4 = 8

6 个答案:

答案 0 :(得分:2)

这是循环调用的方式。记住步骤编号和缩进:

1. starts with 2,4
2.  goes into else, returns 2 + <starts again>
3.   starts with 2,3
4.    goes into else, returns 2 + <starts again>
5.     starts with 2,2
6.      goes into else, returns 2 + <starts again>
7.       starts with 2,1
8.        goes into else, returns 2 + <starts again>
9.         starts with 2,0
10.          goes into if, returns 0 to step 8
11.       goes to step 8, returns 2 + 0 (=2) to step 6
12.     goes to step 6, returns 2 + 2 (=4) to step 4
13.   goes to step 4, returns 2 + 4 (=6) to step 2
14. goes to step 2, returns 2 + 6 (=8) to the main call 

答案 1 :(得分:1)

查看递归或循环如何工作的最佳方法是“放松”#39;它:

  • 您第一次使用mult2作为4中的参数致电main
  • mult检查b4)是否等于0.事实并非如此。
  • mult然后在使用a和{2调用时,将multa}添加到one less than b结果中{1}}(这将是3)。
  • mult检查b3)是否等于0.事实并非如此。
  • mult然后在使用a和{2调用时,将multa}添加到one less than b结果中{1}}(这将是2)。
  • mult检查b2)是否等于0.事实并非如此。
  • mult然后在使用a和{2调用时,将multa}添加到one less than b结果中{1}}(这将是1)。
  • mult检查b1)是否等于0.事实并非如此。
  • mult然后在使用a和{2调用时,将multa}添加到one less than b结果中{1}}(这将是0)。
  • mult检查b0)是否等于0.这是!返回0
  • 调用函数然后添加a2)并返回结果(2)。
  • 之前的调用函数会添加a2)并返回结果(4)。
  • 之前的调用函数会添加a2)并返回结果(6)。
  • 之前的调用函数会添加a2)并返回结果(8)。

考虑递归的最佳方式是有两种情况:第一种情况是“问题不能得到任何更小的”。和任何大于那个&#39;的情况。在第一个或“基本案例”中你会得到一些容易理解的金额。在这种情况下,它是0。在其他每种情况下,您都会计算出稍微小一点的增量差异。

在您的示例中,我们将一个因子减少1(使问题变小)并将另一个因子添加到较小问题的结果中(计算增量差异)。基本情况&#39;如果一个因素是0:我们知道任何乘以0的数字都是0,因此返回此金额是微不足道的。

答案 2 :(得分:1)

好吧,让我们举个例子2 * 4,这与做2 + 2 + 2 + 2完全相同。将其翻译为您的代码(注意递归将在b = 0时停止),我们可以通过调用mult(2, 4)

  • mult(2, 4) = 2 + mult(2, 3)
  • mult(2, 3) = 2 + mult(2, 2)
  • mult(2, 2) = 2 + mult(2, 1)
  • mult(2, 1) = 2 + mult(2, 0)
  • mult(2, 0) = 0

替换mult(2, 0)中的mult(2, 1)mult(2, 1)中的mult(2, 2)等等,我们获得:2 + 2 + 2 + 2 + 0 = 8

答案 3 :(得分:0)

您的递归功能render 'messages/validation_errors'被称为mult次。并且每次都将您累积的函数b调用到返回的值。因此,您基本上会添加a a次,因此会生成b

我建议您存储更改行:

a*b

return a + mult(a, b - 1);

并在递归时观察临时值。

答案 4 :(得分:0)

对于a = 2,b = 4,现在因为b不是0,所以a将被添加并且它将进入递归,其中b = 3.同样发生直到b = 0,当0返回时继续返回中间计算。

**

> Ex :  b = 4  Stack :  a + mul(3) - > a + mul(2) -> a +mul(1) -> a + mul(0) 
> mul(0) = 0 which is return to calling function 
> Now mul(1) = a + mul(0), which is a + 0 = a; 
  then, a + mul(1) = a  + a = 2a, which would be returned to mul(2) 
  then a + mul(2) = a + 2a = 3a 
  then a + 3a = 4a, which would be return to calling function.

**

答案 5 :(得分:0)

乘以A和B只是添加A,B次数。 在你的这个例子中,你是在结果中加A,每次递减B直到B达到零(这是基本情况)。这是理想情况下将A添加到结果B的次数。