[英]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
使用2
和4
作为参数调用mult
。 mult
检查b
(它是4
)是否等于0。不是。 mult
然后添加a
(其2
)到的结果 mult
当与称为a
和one less than b
(这将是3
)。 mult
检查b
(等于3
)是否等于0。不是。 mult
然后添加a
(其2
)到的结果 mult
当与称为a
和one less than b
(这将是2
)。 mult
检查b
(等于2
)是否等于0。不是。 mult
然后添加a
(其2
)到的结果 mult
当与称为a
和one less than b
(这将是1
)。 mult
检查b
(等于1
)是否等于0。不是。 mult
然后添加a
(其2
)到的结果 mult
当与称为a
和one 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.