繁体   English   中英

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

[英]How to calculate multiplication of two numbers recursively

我正在阅读有关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);
        }
    }
}

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

这就是它遍历调用的方式。 注意步骤编号和缩进:

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 

查看递归或循环工作方式的最佳方法是“放松”它:

  • 您第一次在main使用24作为参数调用mult
  • mult检查b (它是4 )是否等于0。不是。
  • mult然后添加a (其2 )到的结果 mult当与称为aone less than b (这将是3 )。
  • mult检查b (等于3 )是否等于0。不是。
  • mult然后添加a (其2 )到的结果 mult当与称为aone less than b (这将是2 )。
  • mult检查b (等于2 )是否等于0。不是。
  • mult然后添加a (其2 )到的结果 mult当与称为aone less than b (这将是1 )。
  • mult检查b (等于1 )是否等于0。不是。
  • mult然后添加a (其2 )到的结果 mult当与称为aone less than b (这将是0 )。
  • mult检查b (等于0 )是否等于0。 返回0
  • 然后,调用函数添加a (为2 )并返回结果( 2 )。
  • 然后,先前的调用函数添加a (为2 )并返回结果( 4 )。
  • 然后,先前的调用函数添加a (为2 )并返回结果( 6 )。
  • 然后,先前的调用函数添加a (为2 )并返回结果( 8 )。

考虑递归的最佳方法是有两种情况:第一种情况是“问题不能变得更小”,而“任何大于此问题的情况”。 在第一个(或“基本情况”)中,您返回一些易于理解的金额。 在这种情况下为0 在其他每种情况下,您都可以计算出增量差,从而得出较小的问题。

在您的示例中,我们将一个因子减少1 (使问题更小),并将另一个因子加到较小问题的结果中(计算增量差)。 “基本情况”是如果一个因子为0 :我们知道任何数字乘以0就是0 ,因此返回这个数量很简单。

好,让我们以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)等等o在,我们得到: 2 + 2 + 2 + 2 + 0 = 8

您的递归funtion mult被调用b的次数。 并且每次都调用将a累积的函数作为返回值。 因此,您基本上增加a b次,因此得出a*b

我建议您存储更改行:

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

int temp = a + mult(a, b - 1); return temp

并在递归展开时观察temp的值。

对于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.

**

将A和B相乘仅是将A,B相乘。 在您的本示例中,您将A添加到结果中,并且每次B递减,直到B达到零(这是基本情况)。 理想情况下,将A添加到结果B的次数是多少。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM