Y Combinator を JavaScript で試す - SICP(計算機プログラムの構造と解釈) 問題4.21

SICP(計算機プログラムの構造と解釈)の問題4.21 にある Y Combinator を JavaScript で実装してみる。

Factorial

Factorial のスクリプトコード

(function (n) {
    return (function (fact) {
        return fact(fact, n);
    })((function (ft, k) {
        return k == 1 ? 1 : k * ft(ft, k - 1);
    }));
})(10)

実行結果




Fibonacci

Fibonacci のスクリプトコード

(function (n){
    return (function (fib) {
        return fib(fib, n);
    })((function (fb, k) {
        switch (k) {
            case 0: return 0;
            case 1: return 1;
            default: return fb(fb, (k - 1)) + fb(fb, (k - 2));
        };
    }));
})(10)

実行結果



even? odd?

even? odd? のスクリプトコード

var f = function (x) {
    return (function (even, odd) {
        return even(even, odd, x);
    })((function (ev, od, n) {
        return n == 0 ? true : od(ev, od, n - 1);
    }),
    (function (ev, od, n) {
        return n == 0 ? false : ev(ev, od, n - 1);
    }));
};

実行結果 f(42)



実行結果 f(37)