javascript 为什么会这样?“乘(arr,n)==乘(arr,n - 1)* arr[n - 1]”

56lgkhnf  于 2023-01-04  发布在  Java
关注(0)|答案(8)|浏览(147)

我只是不理解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);等于2
34567
乘以(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]**?有人能告诉我这段代码是怎么回事吗?为什么它们是相等的?

zd287kbt

zd287kbt1#

好吧,我会试着用我想出来的方法来解释。我在这个问题上也遇到了麻烦。
这部分是这里的困惑:* * 乘(arr,n)==乘(arr,n-1)* arr [n-1]**
假设我们有一个数组,它是:var arr =[1,2,3,4,5]这里的n是指数组中元素的个数,是5,因为数组中有5个元素。
现在在给出的第一个函数中:
函数乘(arr,n){

var product = 1;

for (var i = 0; i < n; i++) {

    product *= arr[i];

}

return product;

}
在这里,我们可以发现左边的困惑是函数本身,即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。

    • 所以我们左边的混乱值是120**

然后我们来到困惑的右边。

    • 乘以(arr,n-1)* arr [n-1]**

这部分有两个东西相乘
第一个是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。
现在,让我们将这两部分相乘:
我们有:

    • 乘以(arr,n-1)**= 24并且,arr [n-1]= 5

5 * 24 = 120,这与我们在困惑的左边得到的结果相同。
希望这个有用。

vulvrdjw

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个元素相乘。

iklwldmw

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项。

p1tboqfb

p1tboqfb4#

所以i doudt multiply(arr, n) and multiply(arr, n - 1) * arr[n]会给予相同的值。multiply(arr, n)会给出第一个n项的结果。见下面的证明:

注意:下面的代码是伪代码

//given the array below
var arr = [1,2,3,4]
// if n = 3
return multiply(arr, n); //output will be [1,2,3] = 1*2*3 = 6

//but
multiply(arr, n - 1) * arr[n]; //output will be [1,2]*4 => 1*2*4 = 8
//therefore 
multiply(arr, n) != multiply(arr, n - 1) * arr[n];

但是

//given the array below
var arr = [1,2,3,4]
// if n = 3
return multiply(arr, n); //output will be [1,2,3] = 1*2*3 = 6

//but
multiply(arr, n - 1) * arr[n - 1]; //output will be [1,2]*3 => 1*2*3 = 6
//therefore 
multiply(arr, n) == multiply(arr, n - 1) * arr[n - 1];

我希望这对你有帮助

f5emj3cl

f5emj3cl5#

multiply(arr,n) == multiply(arr, n-1) * arr[n-1] //equation

arr = [1,2,3,4,5,6,7,8] //sample array used

对于这个问题,你需要喜欢阶乘,如果你想不起来了,请在youtube上看看。
arr中,n是数组中要相乘的值的数量。
示例:

when n = 4
multiply(arr,4) //calls the first 5 elements of array to be multiplied  by each other.

leftside
multiply(arr,4) = 1x2x3x4 = 4! = 24 //

rightside
multiply(arr,4-1) x arr[3] //arr[3] is the 4th element of the arr
multiply(arr,3) x 4
(arr,3) = 1x2x3 = 3!
(arr,3) = 1x2x3x4 = 4! //this is multiply(arr,3)*4

因此,你可以看到,无论你在arr内提供哪个n值,该等式都成立。

vuv7lop3

vuv7lop36#

let myArr = [2, 4, 5, 6];
function multiply(arr, n) {
  if (n <= 0) {
    return 1;
  } else {
     return multiply(arr, n - 1) * arr[n-1];
  }
}

该代码的工作原理如下:
对于函数的每次调用如果我传递myArr和4作为参数

multiply(arr, 4 - 1) == 6
arr[3-1] == 5
multiply(arr, 2 - 1) == 4
arr[1-1] == 2
multiply(arr, 0 - 1) == -1 n < 0 ; return 1
where : 6*5*4*2*1 == 240
58wvjzkj

58wvjzkj7#

以下是我的解释。
例如arr = [1,2,3,4]n = 4(数组中元素的总数)
这是公式

multiply(arr,n) = multiply(arr, n - 1) * arr[n - 1];
multiply([1,2,3,4], 4) = multiply([1,2,3,4], 3) * arr[3];   
multiply([1,2,3,4], 4) = multiply([1,2,3,4], 3(first 3 elements of array) * 4(last element in array);
multiplt([1,2,3,4], 4) = (1*2*3) * 4; ==> 12

所以,基本上我们把所有元素相乘,除了最后一个,然后所有元素的乘积乘以最后一个。

7hiiyaii

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......结果相同。
如果我错了,请帮忙,谢谢)

相关问题