我偶然发现了一个有趣的递归 lambda 示例,但我真的不明白为什么它会以这种方式工作。
rec = lambda x : 1 if x==0 else rec(x-1)*x
f = rec
rec = lambda x: x+1
print(f(10))
在javascript中相同。
var rec = function(a) {
if (a == 0) return 1;
return rec(a - 1) * a;
}
var f = rec
rec = function(a) {
return a + 1;
}
console.log(f(10));
令我惊讶的是这两个打印 100 而不是 10!(正如我所料)。
为什么重新分配 rec 会改变 f 函数的行为?当 rec 变量在 lambda 中被捕获时,它不是指的是 lambda 本身吗?
编辑。由于大多数答案都解释了发生了什么,让我重新表述这个问题,因为我正在寻找更深入的解释。
那么在第一行中声明函数 rec 的那一刻,为什么函数体中的 rec 没有绑定到自身?
例如,如果您使用 JavaScript 并按照您得到的其中一个答案中的建议,以看似“相同”的方式重写第一行:
var rec =function rec(a) {
if (a == 0) return 1;
return rec(a - 1) * a;
};
f = rec;
rec = function (a) {
return a + 1;
}
console.log(f(10));
这个打印出10个!正如人们所期望的那样。
所以在这种情况下,“内部 rec”(在函数体中)绑定到函数名的 rec 而不是查看 rec 变量,并且变量 rec 的重新分配没有改变行为。
所以我真正要问的是这些语言决定在 lambda 中绑定变量的机制。
我正在为一个班级项目自己编写一个解释器,我遇到了同样的问题,即何时何地绑定这些变量。所以我想了解这在流行语言中是如何工作的,以实现类似的东西。
开心每一天1111
一只萌萌小番薯
相关分类