我正在阅读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
。
答案 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;它:
mult
和2
作为4
中的参数致电main
。mult
检查b
(4
)是否等于0.事实并非如此。mult
然后在使用a
和{2
调用时,将mult
(a
}添加到one less than b
的结果中{1}}(这将是3
)。 mult
检查b
(3
)是否等于0.事实并非如此。mult
然后在使用a
和{2
调用时,将mult
(a
}添加到one less than b
的结果中{1}}(这将是2
)。 mult
检查b
(2
)是否等于0.事实并非如此。mult
然后在使用a
和{2
调用时,将mult
(a
}添加到one less than b
的结果中{1}}(这将是1
)。 mult
检查b
(1
)是否等于0.事实并非如此。mult
然后在使用a
和{2
调用时,将mult
(a
}添加到one less than b
的结果中{1}}(这将是0
)。 mult
检查b
(0
)是否等于0.这是!返回0
。a
(2
)并返回结果(2
)。a
(2
)并返回结果(4
)。a
(2
)并返回结果(6
)。a
(2
)并返回结果(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的次数。