2009-11-17 55 views
5

任何人都可以解釋Man Or Boy Test返回的值是-67嗎?
我試圖寫下結果,或用調試器跟蹤它。任何幫助,將不勝感激。
可以找到不同實現的列表here「Man or Boy」Knuth測試如何工作?

+0

這聽起來像是功課,你能解釋前9次迭代是如何工作的嗎?如果你可以做前4個,那麼確定它是如何得到-67應該很容易。這可能有助於更多的答案即將出現,我猜想。 – 2009-11-17 07:31:32

+3

我希望能從已經知道答案的人那裏得到答案。如果您認爲自己完全有能力完成任務,但這絕對不是功課。所有提及的測試我都可以找到說「嘗試在紙上工作可能是沒有用的」這種或那種形式。 – CaptainCasey 2009-11-17 22:00:14

回答

3

This is a nice page對這個男人或男孩的測試。它顯示了以下有趣的事實:

k = 10:A = -67和A被稱爲722次,B被稱爲(A-1)次。

寫一個完整的呼叫追蹤在這種情況下有點用處,因爲函數在本質上是遞歸,增加的功能都沒有(你可以在哈斯克爾翻譯看,它要求使用STate Monads(包裹在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編譯器的時候,有些實現並不正確。測試是爲了將不正確的實現與正確的實現分開。