2009-11-17 8 views
5

Man Or Boy Testが-67の値を返す方法を説明できる人はいますか?
私は無駄に結果を書き留めたり、デバッガでトレースしてみました。どんな助けもありがとう。
異なる実装のリストはhereです。"Man Or Boy" Knuthテストはどのように機能しますか?

+0

これは宿題のように聞こえますが、最初の9回の反復がどのように機能するか説明できますか?あなたが最初の4つを行うことができれば、それがどのように得られるかを判断することは容易であるはずです。それは今後の答えが増えるのを助けるかもしれない、私は推測するだろう。 –

+3

私はすでに答えを知っていた人から答えを得ることを望んでいました。あなたは、あなたが徹底的に課題に取り組んでいると思うなら、これはほとんど確実に宿題ではありません。私が見つけることができるテストへのすべての言及は、ある形または別の形で「紙の上でそれを処理しようとするのはおそらく無駄です」と言います。 – CaptainCasey

答えて

3

This is a nice pageこの男または男の子のテスト。

k = 10:A = -67とAを722回呼び出すと、Bは(A - 1)回呼び出されます。あなたはHaskellの翻訳に見ることができるように機能が自然の中で再帰あるような完全なcalltraceを書く

は、(機能が純粋ではないことに加えて、この場合にはビット無用である、それが必要ですkを包むSTate Monadsの使用:各関数のスコープ(この場合、変数k:それは1だけ減じられる)は、各呼び出しまたは再帰が変更され、これらの変更は正解の計算に必要とされる。

私は少し読みやすく、元ALGOL60の実装よりもJavaScriptの翻訳を見つける:

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コンパイラが作成されたとき、実装のいくつかは正しくありませんでした。誤った実装を正しいものから分離するためのテストが行​​われました。

関連する問題