Ошибка при нахождении среднего арифметического
Есть функция для нахождения среднего арифметического:
function average() {
var sum = 0;
for (var i = 0; i < arguments[i]; i++ ) sum += arguments[i];
return sum == 0 ? sum : sum / arguments.length;
}
Если пишем так: average(2, 5, 5, 5);
Получаем: 4,25
Вроде все хорошо, но если написать: average(5, 5, 5, 2);
Получаем: 3.75
Подскажите, пожалуйста, почему так и как исправить?
Ответы (4 шт):
Автор решения: Александр Лесив
→ Ссылка
function average() {
var sum = 0;
for (var i = 0; i < arguments.length; i++ ){
sum += arguments[i]
};
return sum == 0 ? sum : sum / arguments.length;
}
console.log(average(5, 5, 5, 2))
Вы допустили ошибку в условии цикла:
for (var i = 0; i < arguments[i]; i++ ){
sum += arguments[i]
};
Цикл выполнялся до тех пор, пока i меньше за i-тый элемент.
Автор решения: doox911
→ Ссылка
- arguments - deprecated.
- Старайтесь не помещать в циклы операции типа:
args.length. - Используйте
===
function average(...args) {
let sum = 0;
let args_length = args.length;
for (let i = 0; i < args_length; i++ ) {
sum += args[i];
}
return sum === 0 ? sum : sum / args_length;
}
console.log(average(5, 5, 5, 2));
console.log(average(2, 5, 5, 5));
Автор решения: Yugofx
→ Ссылка
function average(...args) {
return args.reduce((sum, i) => sum + i, 0) / args.length || 0;
}
Совсем уж фриковый, но интересный способ нашел на подобном вопросе в глобальном SO. По записи короче всего.
function average(...args) {
return eval(args.join('+')) / args.length || 0;
}
Автор решения: Qwertiy
→ Ссылка
ES5
function average() {
var sum = 0;
for (var i = 0; i < arguments.length; ++i) sum += arguments[i];
return sum && sum / arguments.length;
}
console.log(average(5, 5, 5, 2))
console.log(average(5, -5))
console.log(average(0))
console.log(average())
ES6
function average(...args) {
var sum = 0;
for (var x of args) sum += x;
return sum && sum / args.length;
}
console.log(average(5, 5, 5, 2))
console.log(average(5, -5))
console.log(average(0))
console.log(average())