Javascript:阶乘函数可以工作,但我想知道它内部语句的必要性

Javascript:阶乘函数可以工作,但我想知道它内部语句的必要性,javascript,Javascript,我正在写一个函数,它接受一个数字并返回它的阶乘。它可以工作,但是为什么必须在第二个for()语句的第一个参数上使用“-1” var firstFactorial = function(num){ var numBreakdown = []; var total = 1; for(var i = 1; i <= num; i++){ numBreakdown.push(i); } for(var y = numBreakdown.length-1; y >

我正在写一个函数,它接受一个数字并返回它的阶乘。它可以工作,但是为什么必须在第二个for()语句的第一个参数上使用“-1”

var firstFactorial = function(num){
  var numBreakdown = [];
  var total = 1;
  for(var i = 1; i <= num; i++){
    numBreakdown.push(i);
  } 
  for(var y = numBreakdown.length-1; y > 0; y--){
        total *= numBreakdown[y]
    }
  console.log(total);
  return total;
}
firstFactorial(7);
var firstFactorial=函数(num){
var numBreakdown=[];
var总计=1;
对于(变量i=1;i 0;y--){
总计*=numBreakdown[y]
}
控制台日志(总计);
返回总数;
}
第一因子(7);
在上面的评论中很好地解释了
-1
背后的原因:


数组索引从0变为小于长度的1。['first'、'second'、'third']具有索引0、1和2。但是,不知道为什么要将要相乘的数字存储在数组中;首先你可以把总数乘以

至于阶乘函数,大部分都是不必要的,包括使用数组来存储阶乘的因子。请参见下面的替代实现

函数阶乘(n){
如果(n<0)抛出新的TypeError('n'必须是非负的')
var结果=1
而(n>1)结果*=n--
返回结果
}
console.log(阶乘(0))/=>1
console.log(阶乘(1))/=>1
console.log(阶乘(7))/=>5040
在上面的评论中很好地解释了
-1
背后的原因:


数组索引从0变为小于长度的1。['first'、'second'、'third']具有索引0、1和2。但是,不知道为什么要将要相乘的数字存储在数组中;首先你可以把总数乘以

至于阶乘函数,大部分都是不必要的,包括使用数组来存储阶乘的因子。请参见下面的替代实现

函数阶乘(n){
如果(n<0)抛出新的TypeError('n'必须是非负的')
var结果=1
而(n>1)结果*=n--
返回结果
}
console.log(阶乘(0))/=>1
console.log(阶乘(1))/=>1

log(阶乘(7))/=>5040
这是因为在数组中,最后一个元素的索引(位置)总是比长度小一个。您必须从长度为1的索引上的最后一个元素开始操作

这是包含所有七个元素及其索引的数组

                    numBreakdown=[1,2,3,4,5,6,7]
                                  | | | | | | |
                            index:0,1,2,3,4,5,6

您可以看到,要访问元素7,必须使用numBreakdown[6]或numBreakdown[length-1],此处length=7或numBreakdown[y],其中y=length-1。

这是因为在数组中,最后一个元素的索引(位置)总是比长度小一个。您必须从长度为1的索引上的最后一个元素开始操作

这是包含所有七个元素及其索引的数组

                    numBreakdown=[1,2,3,4,5,6,7]
                                  | | | | | | |
                            index:0,1,2,3,4,5,6

您可以看到,要访问元素7,必须使用numBreakdown[6]或numBreakdown[length-1],此处length=7或numBreakdown[y],其中y=length-1。

它是从长度中减去1,然后向后迭代数组。数组索引从0变为小于长度的1<代码>['first'、'second'、'third']具有索引0、1和2。但是,不知道为什么要将要相乘的数字存储在数组中;首先,你可以将
总数
乘以。@Ryan谢谢,我会试试的@AndrewLi对此表示感谢,但如果我们从长度中减去1,在这种情况下,它似乎会从6开始乘以,而不是7。我不完全理解。@ColinSygiel如果我们有数组[1,2,3],长度将是3,但最高索引将是2,正如Ryan解释的那样。因此,从3-1开始,也就是2,然后往回走。它从长度中减去1,然后向后迭代数组。数组索引从0变为比长度小1<代码>['first'、'second'、'third']具有索引0、1和2。但是,不知道为什么要将要相乘的数字存储在数组中;首先,你可以将
总数
乘以。@Ryan谢谢,我会试试的@AndrewLi对此表示感谢,但如果我们从长度中减去1,在这种情况下,它似乎会从6开始乘以,而不是7。我不完全理解。@ColinSygiel如果我们有数组[1,2,3],长度将是3,但最高索引将是2,正如Ryan解释的那样。因此,您可以从3-1开始,也就是2,然后向后走。谢谢您的简化代码。不带{}的if语句的概念对我来说是新概念,但我认为这是次要的:)在上面的回答中很好地解释了这一点。其思想是,在给定的数组索引中存储的数字总是精确的(索引+1),而-1是为了补偿这一差异。计算机科学中的数组索引几乎总是从零开始,而不是从一开始;因此,将它们看作是从数组开始的偏移量,而不是第n个数组插槽,这会很有帮助。不带{}的if语句的概念对我来说是新概念,但我认为这是次要的:)在上面的回答中很好地解释了这一点。其思想是,在给定的数组索引中存储的数字总是精确的(索引+1),而-1是为了补偿这一差异。计算机科学中的数组索引几乎总是从零开始,而不是从一开始;因此,将它们视为从阵列开始的偏移量,而不是第n个阵列插槽,这会很有帮助。很好,您的可视化让它非常清晰!非常感谢!美丽,你的想象让它如此清晰!非常感谢!