@Iliyaity

Как работает рекурсия?

Задача из книги выразительный JS.

Можно получить бесконечное количество чисел, начиная с числа 1, и потом либо добавляя 5, либо умножая на 3. Как нам написать функцию, которая, получив число, пытается найти последовательность таких сложений и умножений, которые приводят к заданному числу? К примеру, число 13 можно получить, сначала умножив 1 на 3, а затем добавив 5 два раза. А число 15 вообще нельзя так получить.

В объяснение сказано,что функция дважды вызывает себя, один раз с каждым из способов. Если первый вызов возвращает не null, он возвращается. В другом случае возвращается второй.

Никак не могу понять как работает данный пример. При find(13) => , "(((1 * 3) + 5) + 5)" Первый вызов не вызывает ошибки. 1 + 5 не возвращает null , так почему выполняется второе или. А при find(18) => "((1 + 5) * 3)") Первое или срабатывает только один раз , но ведь 6 + 5 тоже соответствует условиям и не вызывает null. Объясните пожалуйста , как все это работает?

function findSolution(target) {
  function find(start, history) {
    if (start == target)
      return history;
    else if (start > target)
      return null;
    else
      return find(start + 5, "(" + history + " + 5)") ||
             find(start * 3, "(" + history + " * 3)");
  }
  return find(1, "1");
}

console.log(findSolution(24));
  • Вопрос задан
  • 353 просмотра
Решения вопроса 1
Stalker_RED
@Stalker_RED
Я добавил пару строчек для наглядности (#6 и #10)
https://jsfiddle.net/sa544rer/1/

Так понятнее?
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@zhainar
Гуглю за вас
Ответ написан
Комментировать
alexprik07
@alexprik07
Программист, верстальщик.
Для начала вам стоит прочитать теорию о рекурсии. Без мат. части никуда. Далее, вам стоит глянуть логи. Они же записываются.

В функцию передаётся начальное значение, find(1, "1") проводится вычисление и снова вызывается сама функция, если мы не вышли за предел числа. Если равно, то всё прекрасно, число соответствует.

P.S. Прочитайте про рекурсию. Сразу всё поймёте.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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