我相信我在數學上理解Y-組合器的想法:它返回給定功能F
的固定點,因此f = Y(F)
其中f
滿足f == F(f)
。Y-combinator如何以編程方式計算固定點?
但我不明白它是如何明智的實際計算程序?
讓我們給here(我還包括在評論一個CoffeeScript的版本,它更易於閱讀)的JavaScript例如:
var Y = function (F) {
return (function(x) {
return F(function(y) {
return x(x)(y);
});
})(function(x) {
return F(function(y) {
return x(x)(y);
});
});
};
var Factorial = function (factorial) {
return function (n) {
if (n === 0) {
return 1;
} else {
return n * factorial(n - 1);
}
}
};
/* Equivalent CoffeeScript:
Y = (F) ->
((x) -> F((y) -> x(x)(y)))((x) -> F((y) -> x(x)(y)))
Factorial = (factorial) ->
if n == 0 then 1 else n * factorial(n-1)
*/
Y(Factorial)(6) == 720 // => true
computed_factorial = Y(Factorial)
我不明白的部分是如何computed_factorial
功能(固定點)實際上得到計算?通過追蹤Y的定義,您會發現它在x(x)
零件處運行到無限遞歸,我看不到任何暗示的終止情況。但是,它奇怪地返回。誰能解釋一下?
也許[這](http://stackoverflow.com/a/13759513/1048572)幫助? – Bergi
無限遞歸是懶惰的。該函數並不總是被調用,它只是反覆傳入(在'factorial'的基本情況下,它不再被使用) – Bergi
謝謝@Bergi我已經在你的幫助下找到了它。在'Y(F)'的時候,遞歸結構'x(x)'只是一個引用,它被傳入並作爲boundial變量'factorial'存儲在Factorial函數中,它不會被調用那一點。 –