@alekcena
Нелинейный наставник

Как решить задачу без зацикливания?

Задача- дан масив с цифрами от 1 до 5.
Если среднее значение суммы чисел массива меньше или равно 4.9 то добавить в конец цифру 5 и повторить круг.
При проверки условия <=4.9 вызываю эту же функцию, пытаясь создать рекурсию вызывает зацикливание, объясните что /делаю не так.
let sred = [2,5,3,5];
let a = 0;
let b = 0;
function test(arr){
if(arr.length<2){
	if(arr[0]===5){
	alert('условие уже выполнено, среднее 5');
} 
else{
	for(let i = 0; i<arr.length; i++){
	a+= arr[i];
}
}
}
 if (a/arr.length<4.9){
 	arr.push(5);
 	test(arr);
 }
 else{
 	for(let i = 0; i<arr.length; i++){
 		if(arr[i]===5)
 		b++
 	}
 	alert(b);
 }

}
  • Вопрос задан
  • 156 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function test(arr) {
  let len = arr.length;
  let sum = arr.reduce((acc, val) => acc + val, 0);
  while (sum / len <= 4.9) {
    arr.push(5);
    len++;
    sum += 5;
  }
  return arr;
}
console.log(test([2,5,3,5]));

// Array(51) [ 2, 5, 3, 5, 5, 5, 5, 5, 5, 5, … ]
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@antonwx
Ой, что-то тут проще с нуля если честно
var sred = [2,5,3,5];
function getSumm(arr){
	let s = 0;
	for(let i=0;i<arr.length;i++) s+=arr[i];
	return s;
}
function getModifiedArray(arr){
 	while(getSumm(arr) / arr.length <= 4.9) arr.push(5);
	return arr;
}
var modArray = getModifiedArray(sred);
console.log(modArray);
console.log(getSumm(modArray) / modArray.length);
Ответ написан
Комментировать
Вы проверяете какие-то странные условия для выхода из рекурсии. По идее код должен выглядеть так:

let arr = [2, 5, 3, 5];

function test(arr) {
  let N = arr.length;

  if (N < 1) {
    console.log("Error");
    return;
  }

  let average = arr.reduce((sum, elem) => (sum + elem)) / N;

  if (average <= 4.9) {
    console.log("Push 5. New test");
    arr.push(5);
    test(arr);
  } else {
    console.log("OK. Average = " + average);
  }
}
Ответ написан
Комментировать
Seasle
@Seasle Куратор тега JavaScript
Может как-то так?
const numbers = [2, 5, 3, 5];
let countOfIterations = 0;

const average = array => array.reduce((accumulator, value) => (accumulator += value)) / array.length;

while (true) {
  const averageNumber = average(numbers);

  if (averageNumber < 4.9) {
    countOfIterations++;
    numbers.push(5);
  } else {
    break;
  }
}

console.log('Среднее значение:', average(numbers));
console.log('Количество итераций:', countOfIterations);

/*
Среднее значение: 4.9
Количество итераций: 46
*/
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы