Javascript 计算顺序
我的任务是用javascript编写一个函数fJavascript 计算顺序,javascript,Javascript,我的任务是用javascript编写一个函数f 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) (let((set#f)) (定义(fn) (如已设置) 0 (开始(设定!设定) n) )) fn))我肯定有一个
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)
(let((set#f))
(定义(fn)
(如已设置)
0
(开始(设定!设定)
n) ))
fn))我肯定有一个较短的版本
function f(arg) {
if (!f.called && arg === 0) {
f.called = true;
return 0;
} else if (f.called && arg === 1) {
return 1;
}
return 0;
}
我相信有一个较短的版本
function f(arg) {
if (!f.called && arg === 0) {
f.called = true;
return 0;
} else if (f.called && arg === 1) {
return 1;
}
return 0;
}
该方案的解决方案似乎归结为
var f = (function() {
var set = false;
function fn(n) {
if (set) {
return 0;
} else {
set = true;
return n;
}
}
return fn;
}());
这有点无聊,但却是意料之中的事。是的,您需要跟踪
f
之外的某个地方的状态,声明一个额外变量是最简单的解决方案。不过,它不需要是全局的,set
隐藏在IIFE的范围内。方案解决方案似乎归结为
var f = (function() {
var set = false;
function fn(n) {
if (set) {
return 0;
} else {
set = true;
return n;
}
}
return fn;
}());
这有点无聊,但却是意料之中的事。是的,您需要跟踪
f
之外的某个地方的状态,声明一个额外变量是最简单的解决方案。但是它不需要是全局的,set
隐藏在IIFE的范围内。具有函数属性的解决方案
函数f(v){
返回[f.value | | 0,f.value=v][0];
}
console.log(f(0)+f(1));//0具有函数属性的解决方案
函数f(v){
返回[f.value | | 0,f.value=v][0];
}
console.log(f(0)+f(1));//0
在函数之外的某个地方使用变量。f(0)
将始终在f(1)
之前运行。它永远不会“从右到左”计算。当从左到右计算时,你认为f(0)+f(1)+f(2)
的结果会是什么?@user122049如果你有一个解决方案,即使在Scheme中,也请发布它。function f(x){f=function(){return x};return 0}
只是众多可能性之一。但是,不能使用纯函数(没有外部状态)。请在函数之外的某个位置使用变量。f(0)
将始终在f(1)
之前运行。它永远不会“从右到左”计算。当从左到右计算时,你认为f(0)+f(1)+f(2)
的结果会是什么?@user122049如果你有一个解决方案,即使在Scheme中,也请发布它。function f(x){f=function(){return x};return 0}
只是众多可能性之一。但是不,你不能使用纯函数(没有外部状态)。对不起,不能声明函数f之外的任何东西。@user122049,但你的问题没有这么说?不管怎样,我只是为了清楚起见添加了它,以帮助您理解。不需要函数之外的任何内容-请参阅编辑的版本。抱歉,无法声明函数f之外的任何内容。@user122049但您的问题没有说明这一点?不管怎样,我只是为了清楚起见添加了它,以帮助您理解。不需要函数之外的任何内容-请参阅编辑的版本。@user122049调用两次后,必须重新定义f
set
仅对两个调用有效。@user122049在调用两次后,必须重新定义f
<代码>设置
仅适用于两次呼叫。