Задача из книги выразительный 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));