gpt4 book ai didi

javascript - 如何使用 reduce 和 range 编写阶乘函数?

转载 作者:行者123 更新时间:2023-11-30 15:37:27 27 4
gpt4 key购买 nike

function range(start, end) {
var acc = [];
for (var i = start; i < end; i++) {
acc.push(i);
}
return acc;
}

使用范围函数和reduce方法,我需要重写阶乘函数。

function factorial(n) {
// YOUR CODE HERE
}

有人提示我先在 forEach 中编写函数,然后用 range 和 reduce 重写它。这是我的尝试。

function factorial(n){
var product = 1;
n.forEach(function(x){
if(x===0){
return 1;}
product *= factorial(x-1);
});
return product;
}

factorial(4);

那是我的尝试。我知道这很乱,但我的问题是,当 n 只是一个数字而 forEach 用于数组时,我如何使用 forEach?因为他们要我先使用 each 来编写阶乘函数,所以我需要使用基本案例,对吗?我还查看了 MDN 并尝试通过遵循他们使用 accumulator + currentValue 的语法来理解 reduce 并提出了这个伪代码。

function factorial(n){
n.reduce(function(x){
x*range;
});
}

factorial(5)

再一次,如果参数不是数组,我不明白如何使用 reduce。

最佳答案

解决这个问题有两个步骤,首先是生成一个数组以使用 reduce 方法,第二个是实际使用 reduce 方法找到我们的阶乘答案。

我们可以使用提供给我们的范围方法来完成第一步。 range 方法返回最小值(含)和最大值(不含)之间的所有整数值的数组。例如,如果我们调用 range(1,5),它将返回 [1,2,3,4]。当我们想要执行阶乘运算时,我们想要将所有先前的整数值包括当前值相乘。要获取所有先前值和当前值的数组,我们可以使用

var factors = range(1,n+1);

在阶乘函数的开头。

现在我们有了所有的因子,我们可以使用 reduce 方法将它们全部相乘。 reduce 方法将按顺序对数组的每个值执行提供的函数。在这种情况下,我们想将所有因素相乘。我们可以使用

var multFactors = factors.reduce(function(a,b){
return a*b;
},1);

将数组中的每个值相乘。通过使用 1 作为 reduce 方法的第二个参数,我们确保 factorial(0) 不会导致任何错误(感谢 @Eterm 注意到这一点)

现在剩下的就是返回 multFactors。

当所有这些放在一起时,你最终会得到这个

function range(start, end) {
var acc = [];
for (var i = start; i < end; i++) {
acc.push(i);
}
return acc;
}

function factorial(n) {
var factors = range(1,n+1);
var multFactors = factors.reduce(function(a,b){
return a*b;
},1);
return multFactors;
}

编辑:

如果您想避免出现负阶乘的错误,您可以对 n 应用绝对值函数。

为此,我们可以改变

var factors = range(1,n+1);

进入

var factors = range(1, Math.abs(n)+1);

取负数的阶乘应该是未定义的,但是对于这一新行,我们通过将数字设为正数来避免任何错误。如果您想保留阶乘的符号,您可以在设置 multFactors 之后但在返回它之前添加这些行。

if(n < 0)
multFactors *= -1;

完成后,你会得到这个(现在有评论,因为它更长)

function range(start, end) {
var acc = [];
for (var i = start; i < end; i++) {
acc.push(i);
}
return acc;
}

function factorial(n) {
//Get the factors
var factors = range(1, Math.abs(n)+1);

//Multiply all of the factors together
var multFactors = factors.reduce(function(a,b){
return a*b;
},1);

//if n was negative make the result negative
if(n < 0)
multFactors *= -1;

//return the calculated result
return multFactors;
}

希望这对您有所帮助。

关于javascript - 如何使用 reduce 和 range 编写阶乘函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41307771/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com