Javascript уменьшить не работает после функции?
Не совсем уверен, где я ошибся, ожидая факториализации 5 (1*2*3*4*5 = 120), превратив 5 в строку [1,2,3,4,5], а затем используя уменьшение умножить строку все вместе. Когда я запускаю код, он просто дает мне [1,2,3,4,5]...
var arr = [];
function factorialize(num) {
for (var i = 1; i <= num; i++) {
arr.push(i);
}
return arr;
}
var factors = 0;
factors = arr.reduce(function(previousVal, currentVal) {
return previousVal * currentVal;
}, 0); // Expecting 120, instead result = [1,2,3,4,5]
factorialize(5);
Простите за долгий путь - моя первая неделя Javascript!
6 ответов
Ты не звонишь factors
, factorialize(5);
делая это, вы просто звоните function factorialize(num)
который даст вам массив (из 1... Num).
(Дополнительная информация) А также в сокращении вы добавляете +
возраст умножения *
так что измените это и
factors = arr.reduce(function(previousVal, currentVal) {
return previousVal + currentVal;
}, 0);
^
|_ either initialize it to 1 or remove this.
Смотрите ниже код. Я просто создаю массив, а затем применяю сокращение к этому массиву.
function factorialize(num) {
var arr = [];
for (var i = 1; i <= num; i++) {
arr.push(i);
}
return arr.reduce(function(previousVal, currentVal) {
return previousVal * currentVal;
});
}
console.log(factorialize(5));
arr
пусто, вы должны сначала дать ему результирующий массив факторизации, и вы должны умножить, а не добавить, а при умножении начальное значение равно 1, а не 0:
var arr = [];
function factorialize(num) {
for (var i = 1; i <= num; i++) {
arr.push(i);
}
return arr;
}
arr = factorialize(5); // give it the value
var factors = arr.reduce(function(previousVal, currentVal) {
return previousVal * currentVal; // multiply, don't add
}, 1); // start with 1 when multiplying
console.log(arr);
console.log(factors);
Если вы просто хотите рассчитать факториал:
function factorial(num) {
var res = 1;
for (var i = 2; i <= num; i++) {
res *= i;
}
return res;
}
console.log('factorial(5) = ' + factorial(5));
console.log('factorial(10) = ' + factorial(10));
var arr = [];
function factorialize(num) {
for (var i = 1; i <= num; i++) {
arr.push(i);
}
var factors = 0;
factors = arr.reduce(function (previousVal, currentVal) {
return previousVal * currentVal;
});
return factors
}
factorialize(5); // 120
Вы можете получить сначала факторы, а затем умножить в Array#reduce
факторы.
Я предлагаю назвать функцию как она делает и переместить объявление массива внутри функции, потому что функция возвращает этот массив.
Для получения продукта необходимо умножить значения и использовать1
в качестве нейтрального начального значения для получения продукта из чисел.
function getFactors(num) {
var i, arr = [];
for (i = 1; i <= num; i++) {
arr.push(i);
}
return arr;
}
var factors = getFactors(5),
product = factors.reduce(function(previousVal, currentVal) {
return previousVal * currentVal;
}, 1);
console.log(factors);
console.log(product);
Проблема с начальным значением, установленным в 0, и вместо умножения чисел, это добавляется
arr.reduce(обратный вызов, initValue)
обр = [1,2,3,4,5]
В представленном коде он накапливается в следующем формате
arr.reduce(function(previousVal, currentVal) {
return previousVal + currentVal;
}, 0);
Первый звонок -> 0 + 1 = 1 (факторы = 1)
Второй вызов -> 0 + 2 = 2 (факторы = 2)
Первый звонок -> 0 + 3 = 3 (факторы = 3)
Первый звонок -> 0 + 4 = 4 (факторы = 10)
Первый звонок -> 0 + 5 = 5 (факторы = 15)
Для достижения ожидаемого результата используйте опцию ниже
var arr = []; // initialize array arr
function factorialize(num) {
//for loop to push 1,2 ,3, 4, 5 to arr array
for (var i = 1; i <= num; i++) {
arr.push(i);
}
// return arr.reduce value by multiplying all values in array, default initial value is first element
return arr.reduce(function(previousVal, currentVal) {
//console log to debug and display loop values
console.log(previousVal, currentVal);
return previousVal * currentVal;
});
}
console.log("output", factorialize(5));
Пример кода - https://codepen.io/nagasai/pen/YaQKZw?editors=1010
- Поместите глобальную переменную
arr
внутри функцииfactorialize
, - Получить возвращенный массив и затем выполнить функцию
reduce
, - Вам нужно умножить, а не сложить цифры.
- Начните уменьшение с initialValue = 1, чтобы избежать
0 * n
,
function factorialize(num) {
var arr = [];
for (var i = 1; i <= num; i++) {
arr.push(i);
}
return arr;
}
var arr = factorialize(5);
var factors = arr.reduce(function(previousVal, currentVal) {
return previousVal * currentVal;
}, 1);
console.log(factors)