#javascript #higher-order-functions
#javascript #функции более высокого порядка
Вопрос:
Я новичок в Javascript и столкнулся с небольшой проблемой. Это проблема домашнего задания, но она оценивается только на основе завершения, поэтому я всего лишь пытаюсь найти правильный ответ для себя.
Предполагается, что я должен определить функцию repeatUntil, которая принимает две другие функции, скажем, f (возвращает число) и g (возвращает логическое значение). Функциональность repeatUntil заключается в повторении функции f по крайней мере один раз, пока g не вернет true.
Вот что у меня есть на данный момент:
function repeatUntil(f, cond) {
var f1;
do{
f1 = f;
return f1;
}
while(cond(f1()));
}
И вот тестер / как мы его называем:
var print = console.log;
var r = repeatUntil(function(x) { return x x }, function(x) { return x >= 20 })
print(r(2))
print("Expected: 32")
Функция выполняется, но моя проблема прямо сейчас заключается в сохранении обновленного значения x из функции repeatUntil. Прямо сейчас функция выполняется только один раз, и условие не обновляется, потому что я не могу передать обновленное значение x в функцию g. Я попытался поместить результат f() в переменную, но он вернет только функцию, а не число.
Любая помощь / совет были бы с благодарностью приняты. Спасибо!
Комментарии:
1. цикл do будет выполнен ровно один раз, потому что вы
return
находитесь в теле цикла — это всего лишь самая очевидная ошибка в вашем коде, после ее исправления возникнут другие проблемы2. Поскольку вам нужно вызвать r(), ваша функция должна возвращать другую функцию
3. @JaromandaX Я пытался ввести return после выхода из цикла, но поскольку условие не обновляется, это дает мне бесконечный цикл прямо сейчас.
4. Вам не нужен возврат, просто условие для выхода из цикла, это условие является результатом вашего вызова cond()
Ответ №1:
Объединение существующих комментариев в ответ.
- Поскольку вам нужно вызвать
r()
, ваша функция должна возвращать другую функцию. - Цикл do будет выполняться ровно один раз, потому что вы возвращаете значение в теле цикла
Код
function repeatUntil(f, cond) {
return function() {
while(cond(f()));
}
}
Комментарии:
1. спасибо @Хуан Мендес! То, чего не хватало в возвращаемой функции, оказывается параметром, который обрабатывает число, используемое f при каждом вычислении (x, которое продолжает меняться каждый раз, когда вычисляется f).