“男人还是男孩”Knuth测试如何运作?

时间:2009-11-17 06:17:04

标签: knuth algol

任何人都可以解释Man Or Boy Test如何返回-67的值? 我徒劳地试着写下结果,或用调试器跟踪它。任何帮助将不胜感激 可以找到不同实现的列表here

1 个答案:

答案 0 :(得分:3)

关于此男人或男孩测试的

This is a nice page。它显示了以下有趣的事实:

k = 10:A = -67,A称为722次,B称为(A - 1)次。

在这种情况下编写完整的calltrace有点无用,因为函数本质上是递归,另外函数不是 pure (你可以在Haskell翻译中看,它需要使用STate Monads,包裹k,以保持杂质的存在):每个函数的范围(在本例中为变量k:它减少了一个)是修改了每个调用或递归,这些修改是计算正确答案所必需的。

我发现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编译器的时间,其中一些实现不正确。进行测试是为了将错误的实现与正确的实现分开。