5

Man Or Boy Testが -67 の値を返す方法を説明できる人はいますか?
結果を書き留めるか、デバッガーでトレースしようとしましたが無駄でした。どんな助けでも大歓迎です。
さまざまな実装のリストは、こちらにあります

4

1 に答える 1

3

これは、この男または少年のテストに関する素晴らしいページです。これは、次の興味深い事実を示しています。

k = 10:A = -67、Aは722回呼び出され、Bは(A-1)回呼び出されます。

この場合、関数は再帰的であるため、完全なコールトレースを作成することは少し役に立ちません。さらに、関数は純粋ではありません(Haskellの翻訳でわかるように、ラップアラウンドされたSTateモナドを使用する必要がありますk。不純物を遠ざけるために):各関数のスコープ(この場合は変数k:1つ減ります)は呼び出しまたは再帰ごとに変更され、これらの変更は正解の計算に必要です。

JavaScriptの翻訳は、元のALGOL60の実装よりも少し読みやすいと思います。

function A(k, x1, x2, x3, x4, x5) { 
    function B() {
        return A(--k, B, x1, x2, x3, x4);
    }
    return k <= 0 ? x4() + x5() : B();
} 
function K(n) { return function() {return n}; }
alert(A(10, K(1), K(-1), K(-1), K(1), K(0)));

秘訣は簿記です。関数への参照がどの副作用(変数の変更)を引き起こし、用語としては正しい関数評価を引き起こします。ただし、前に説明したように、この簿記は面倒です。

このJavaScriptの例などの現代言語には、これらの簿記のケースを処理するための正しいインタープリター/コンパイラーがあります。ALGOL60コンパイラが作成されたとき、一部の実装は正しくありませんでした。テストは、誤った実装を正しい実装から分離するために行われました。

于 2011-07-30T15:29:09.803 に答える