我只是不理解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];
}
}
特别是这部分。乘(arr,n)==乘(arr,n - 1) arr[n - 1]*
如果是这样我能理解;
乘(arr,n)==乘(arr,n - 1)arr[n]
因为如果arr = [2,3,4,5,6,7,8,9]
乘以(arr,5);等于234567
乘以(arr,4);等于23456
乘以(arr,4)* arr[5];等于(23456)7
所以multiply(arr, n)
和multiply(arr, n - 1) * arr[n]
是相同的值”
但是,我不明白为什么**multiply(arr,n)== multiply(arr,n - 1) arr[n - 1]**?有人能告诉我这段代码是怎么回事吗?为什么它们是相等的?
8条答案
按热度按时间zd287kbt1#
好吧,我会试着用我想出来的方法来解释。我在这个问题上也遇到了麻烦。
这部分是这里的困惑:* * 乘(arr,n)==乘(arr,n-1)* arr [n-1]**
假设我们有一个数组,它是:var arr =[1,2,3,4,5]这里的n是指数组中元素的个数,是5,因为数组中有5个元素。
现在在给出的第一个函数中:
函数乘(arr,n){
}
在这里,我们可以发现左边的困惑是函数本身,即multiply(arr,n)。
在这里,乘积不断地与箭头上的元素相乘,直到变量i变成5,然后它停止,因为它不再小于n,而是等于n,n恰好是5,即元素本身的数量。
它的值是从0到4,这些是元素的索引号,这些元素恰好与乘积相乘,乘积是1。
当索引为0时,arr [0]为1
当索引为1时,arr [1]为2
当索引为2时,arr [2]为3
当索引为3时,arr [3]为4
当索引为4时,arr [4]为5
将它们相乘,结果为= 1 * 2 * 3 * 4 * 5 = 120。
然后我们来到困惑的右边。
这部分有两个东西相乘
第一个是multiply(arr,n-1),这是一样的,除了你只需要比上次少一个元素,想想同样的函数,只有元素的数量n,这次少了一个元素,所以n现在是4。
所以现在就变成这样了:
当索引为0时,arr [0]为1
当索引为1时,arr [1]为2
当索引为2时,arr [2]为3
当索引为3时,arr [3]为4
因此,对于第一个multiply(arr,n-1)部分,它们都相乘,结果为= 1 * 2 * 3 * 4 = 24。
接下来是arr [n-1]
这里,我们只获取数组的第n-1个索引,我们知道n是5,因此n-1将是4。我们知道索引从零开始,因此第4个索引将是箭头中的第5项,即5。
这意味着**arr [n-1]**等于5。
现在,让我们将这两部分相乘:
我们有:
5 * 24 = 120,这与我们在困惑的左边得到的结果相同。
希望这个有用。
vulvrdjw2#
第一个月
给定的算法是将数组
arr
的前n
个元素相乘并返回结果。现在,要将前
n
个元素相乘,我们可以将前(n-1)
个元素相乘,然后将结果与数组的第n
个元素相乘。所以,
multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1]
。multiply(arr, n)
表示将数组arr
的前n
个元素相乘。multiply(arr, n - 1)
表示将数组arr
的前n-1
个元素相乘。iklwldmw3#
我自己也是刚上完这堂课,发现自己一时糊涂了,我们的问题是没有意识到arr的第n项不等于arr[n],而是arr[n-1]。
第一个月
在这种情况下你要对前5项求和
multiply(arr, 4); equals 2*3*4*5*6
在这种情况下你要对前四项求和
2*3*4*5
multiply(arr, 4) * arr[5]; equals (2*3*4*5*6)*7
由于项数和索引之间的差异(第一项在[0],第二项在[1],等等),
multiply(arr, 4) * arr[5];
实际上等于(2*3*4*5)*7
,因为arr[5]是数组的第6项而不是第5项。p1tboqfb4#
所以i doudt
multiply(arr, n) and multiply(arr, n - 1) * arr[n]
会给予相同的值。multiply(arr, n)
会给出第一个n项的结果。见下面的证明:注意:下面的代码是伪代码
但是
我希望这对你有帮助
f5emj3cl5#
对于这个问题,你需要喜欢阶乘,如果你想不起来了,请在youtube上看看。
在
arr
中,n
是数组中要相乘的值的数量。示例:
因此,你可以看到,无论你在arr内提供哪个n值,该等式都成立。
vuv7lop36#
该代码的工作原理如下:
对于函数的每次调用如果我传递
myArr
和4作为参数58wvjzkj7#
以下是我的解释。
例如
arr = [1,2,3,4]
、n = 4
(数组中元素的总数)这是公式
所以,基本上我们把所有元素相乘,除了最后一个,然后所有元素的乘积乘以最后一个。
7hiiyaii8#
是啊据我所知(或注意到)除非最后一个“n”值与索引值相同,否则此概念不起作用。2x 4x 7 x6 =1680(n则为2x 4x 7 x“6”=1680......“6”为另一个随机数......只是不是3,而n=(2x 4x 7 x“3”),索引为@3)(在n-1个条件下),这将得到。2x 4x 7 =280...x“3”=840,其中n=2473。这正是我所注意到的,所以是的,这个概念在一定程度上是有效的,除非...这个概念只适用于最后n个数字与索引值相同。最终结果:n为(2473=1680),n-1为(247=280)× 3 =1680......结果相同。
如果我错了,请帮忙,谢谢)