[英]Java simple recursion explanation
我正在实现一个非常简单的递归方法来将两个数字相乘。 我很难理解递归的基础知识。
有人能向我解释(如果可能的话,逐行)这段代码是如何工作的? 我对将基本情况写入返回 0 而实际上返回实际乘法而感到特别困惑。
public static int multiply(int n, int m) {
if (m == 0) {
return 0; //Base case
}
return multiply(n, m - 1) + n; //Recursive Case - Decrements m, while adding n
}
谢谢你的帮助
我会尽量让这个答案对初学者友好。 首先,我将回答您问题的这一部分:
我对将基本情况写入返回 0 而实际上返回实际乘法而感到特别困惑。
在基本情况下返回的值取决于您实现算法的方式。 这里为了计算n*m
,我们将这个乘法扩展到加法。 举几个例子可以更清楚地说明这一点。
2*3 = 2 + 2 + 2 + 0
4*1 = 4 + 0
5*5 = 5 + 5 + 5 + 5 + 5 + 0
n*m = n + n + n + ... + (m times) + 0
这就是我们在基本情况下返回 0 的原因,我们必须停止递归而不对结果进行任何更改,并且只有添加 0 才有可能。
这是这个程序的工作:
public static int multiply(int n, int m) {
if (m == 0) {
return 0; //Base case
}
return multiply(n, m - 1) + n;
让我们取n = 4
和m = 3
。
我们对该方法的第一次调用是multiply(4, 3)
。 然后我们继续进行,基本条件为假,所以我们跳过它。
然后我们进入这部分: return multiply(n, m - 1) + n
。 我们再次调用相同的 function。 multiple(4, 2)
。 我们再次跳过基本情况。 这是一张表:
multiply(4, 3) -> return multiply (4, 2) + 4
multiple(4, 2) -> return multiply (4, 1) + 4
multiple(4, 1) -> return multiply (4, 0) + 4
multiple(4, 0) -> 0
在替换我们得到的返回值时,
multiple(4, 3) -> return 0 + 4 + 4 + 4
multiple(4, 2) -> return 0 + 4 + 4
multiple(4, 1) -> return 0 + 4
multiple(4, 0) -> return 0
如果我们的第一个调用是multiply(n, m)
,那么最后的返回值是:
multiply (n, m) -> return 0 + n + n + n + ... + (m times)
我希望我对你有所帮助。 尝试自己构建一个类似的关系,你会更好地理解它。 这是有关递归的进一步解释的链接:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.