arteqrt
@arteqrt
Почти не начинающий програмист

Как понять этот код?

Пытаюсь учить JavaScript, читаю книгу "Выразительный JavaScript", вот наткнулся на пример кода, который не могу никак разобрать.

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));
// → (((1 * 3) + 5) * 3)


А точнее, я не могу понять, почему выполняется сначала:
find(start * 3, "(" + history + " * 3)");

А потом уже:
return find(start + 5, "(" + history + " + 5)")
Казалось, что логичнее выполнять оператор умножения первым, но вот другой код, в котором все происходит наоборот, как это понимать?
find(1, "1")
find(6, "(1 + 5)")
find(11, "((1 + 5) + 5)")
find(16, "(((1 + 5) + 5) + 5)")
too big
find(33, "(((1 + 5) + 5) * 3)")
too big
find(18, "((1 + 5) * 3)")
too big
find(3, "(1 * 3)")
find(8, "((1 * 3) + 5)")
find(13, "(((1 * 3) + 5) + 5)")
found!
  • Вопрос задан
  • 258 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
return find(start + 5, "(" + history + " + 5)") || find(start * 3, "(" + history + " * 3)");

В этой строке сначала вычисляется первая часть, find(start + 5, "(" + history + " + 5)").
Если полученный результат приводится к true (то есть, в данном случае не null), то возвращается значение первой части.
Если полученный результат приводится к false (то есть, вернулся null), то вычисляется вторая часть find(start * 3, "(" + history + " * 3)") и возвращается её значение.
Чтобы было понятнее, лучше записать в виде:
const result = find(start + 5, "(" + history + " + 5)")
if (result !== null) {
  return result
}
return find(start * 3, "(" + history + " * 3)")
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Kristal1
это бинарные функции
Ответ написан
Ваш ответ на вопрос

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

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