@New-Developer
Изучаю JavaScript

Как исправить функцию?

Есть функция для решения популярной задачи:
function bank(sum, nominals, id = 0) {
  if (sum == 0) return [];
  if (id < nominals.length) {
    for (let i = Math.trunc(sum / nominals[id]); i >= 0; i--) {
      let out = bank(sum - nominals[id] * i, nominals, id + 1);
      if (out != null) {
        return [i].concat(out) //либо return [i, ...out]
      }
    }
  }
}
let n = [1100, 650, 230, 70, 20], s = 2650;
bank(s, n).forEach((v, i) => {if (v > 0) {console.log(`${v} по ${n[i]}`)}})

Как ее исправить, чтобы избавиться от concat() и ... ? Разрешено вводить циклы, менять количество переменных, но не применять глобальные переменные и объекты. Принцип вычисления должен остаться тем же - рекурсия в цикле.
  • Вопрос задан
  • 70 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Например, так:
function bank(summ, nominals, pos = 0, result = null) {
  if (result === null) {
    result = Array(nominals.length).fill(0);
  }
  if (summ === 0) {
    return result;
  }
  if (pos > nominals.length - 1) {
    return null;
  }
  if (summ % nominals[pos] === 0) {
    result[pos] = summ / nominals[pos];
    return result;
  }
  for (result[pos] = Math.trunc(summ / nominals[pos]); result[pos] >= 0; result[pos] -= 1) {
    if (bank(summ - nominals[pos] * result[pos], nominals, pos + 1, result) !== null) {
      return result;
    }
  }
  return null;
}

bank(2650, [1100, 650, 230, 70, 20]); // [ 2, 0, 1, 2, 4 ]
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы