#javascript
#javascript
Вопрос:
Мне поручено написать функцию f на javascript, и
f(0) f(1)//should return 0 if evaluated from left to right
//should return 1 if evaluated from right to left
Как я могу реализовать функцию f? Я думаю о том, чтобы отслеживать, вызывается ли f раньше, но понятия не имею, как это сделать.
Решение схемы выглядит следующим образом:
(определить f (пусть ((установить #f)) (определить (fn n) (если установлено 0 (начать (установить! установить #t) n))) fn))
Комментарии:
1. Используйте переменную где-нибудь за пределами функции.
2.
f(0)
будет выполнятьсяf(1)
всегда раньше. Он никогда не будет оцениваться «справа налево».3. Для чего вы ожидаете получить результат
f(0) f(1) f(2)
при вычислении слева направо?4. @user122049 Если у вас есть решение, даже если в схеме, пожалуйста, опубликуйте его.
5.
function f(x) { f = function() { return x }; return 0 }
это лишь одна из многих возможностей. Но нет, вы не можете обойтись чистыми функциями (без внешнего состояния).
Ответ №1:
Решение схемы, похоже, сводится к
var f = (function() {
var set = false;
function fn(n) {
if (set) {
return 0;
} else {
set = true;
return n;
}
}
return fn;
}());
это немного скучно, но ожидаемо. Да, вам нужно отслеживать состояние где-то за пределами f
, объявление дополнительной переменной — самое простое решение. Однако он не обязательно должен быть глобальным, set
он скрыт в области IIFE.
Комментарии:
1. @user122049 Вы должны переопределить
f
после его повторного вызова.set
работает только для двух вызовов.
Ответ №2:
Решение со свойством функции.
function f(v) {
return [f.value || 0, f.value = v][0];
}
console.log(f(0) f(1)); // 0
function f(v) {
return [f.value || 0, f.value = v][0];
}
console.log(f(1) f(0)); // 1
Ответ №3:
Я уверен, что есть более короткая версия…
function f(arg) {
if (!f.called amp;amp; arg === 0) {
f.called = true;
return 0;
} else if (f.called amp;amp; arg === 1) {
return 1;
}
return 0;
}
Комментарии:
1. Извините, но не могу объявить что-либо вне функции f .
2. @user122049 Но в вашем вопросе об этом не говорится? В любом случае, я просто добавил это для ясности, чтобы помочь вам понять. Нет необходимости в чем-либо вне функции — см. Отредактированную версию.