【发布时间】:2020-10-25 22:21:04
【问题描述】:
我只是无法理解 freeCodeCamp 的“使用递归替换循环”课程。 我将在下面引用该部分;
递归是一个函数可以用以下形式表达的概念 本身。为了帮助理解这一点,首先考虑以下问题 任务:将数组的前 n 个元素相乘以创建乘积 那些元素。使用 for 循环,您可以这样做:
function multiply(arr, n) { var product = 1; for (var i = 0; i < n; i++) { product *= arr[i]; } return product; }但是,请注意 multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1] 。这意味着您可以根据自身重写乘法 并且永远不需要使用循环。
function multiply(arr, n) { if (n <= 0) { return 1; } else { return multiply(arr, n - 1) * arr[n - 1]; } }
尤其是这部分。 multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1]
如果是这样的话我可以理解;
multiply(arr, n) == multiply(arr, n - 1) * arr[n]
那是因为如果 arr = [2,3,4,5,6,7,8,9],
乘法(arr, 5);等于 2*3*4*5*6*7
乘法(arr, 4);等于 2*3*4*5*6
乘法(arr, 4) * arr[5];等于 (2*3*4*5*6)*7
所以multiply(arr, n) 和multiply(arr, n - 1) * arr[n] 是相同的值”
但是,我不明白为什么 multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1] ? 谁能告诉我这段代码发生了什么?为什么他们是平等的?
【问题讨论】:
-
索引从 0 开始,在索引 n 处,会有 undefined。
-
这里的想法是将数组的长度作为初始
n,而不是最后一个元素的索引。另请注意,基本情况是n == 0,而不是n < 0。 -
感谢两位的评论!但是我仍然无法理解这一点.. 有没有人可以用例子解释一下?
标签: javascript loops recursion