2009-11-17 13 views
5

누구나 Man Or Boy Test이 -67 값을 반환하는 방법을 설명 할 수 있습니까?
나는 결과를 적어 두거나 디버거로 추적하려고 노력했다. 어떤 도움을 주시면 감사하겠습니다.
다른 구현 목록은 here입니다."남자 또는 소년"크 누스 테스트는 어떻게 작동합니까?

+0

숙제처럼 들리지만 처음 9 번의 반복 작업이 어떻게 진행되는지 설명 할 수 있습니까? 당신이 처음 4 일을 할 수 있다면 어떻게되는지를 결정하기 위해 -67이 쉬워야합니다. 그게 앞으로 더 많은 답변을 얻는 데 도움이 될 것 같습니다. –

+3

나는 이미 그 해답을 알고있는 누군가로부터 답을 얻기를 희망했다. 당신이 꼭해야 할 일이라고 생각한다면, 이것은 숙제가 아닐 것입니다. 내가 찾을 수있는 테스트에 대한 모든 언급은 "용지를 통해 작업하려고 시도하는 것은 아마도 어떤 경우에도 효과가 없을 것"이라고 말할 수 있습니다. – CaptainCasey

답변

3

This is a nice page이 남성 또는 소년 테스트. 다음과 같은 흥미로운 사실을 보여줍니다 :

k = 10 : A = -67 A는 722 번 호출되고 B는 (A - 1) 번 호출됩니다. 기능이 추가와 함께, 자연 재귀 같이 완전한 calltrace 작성

이 기능을 사용하면 하스켈 번역에서 볼 수없는 순수이 (가 요구 것으로,이 경우에는 약간의 쓸모 k을 사용하여 불순물을 없애기 위해 각 함수의 범위 (이 경우 변수 k : 하나씩 줄임)가 각 호출이나 재귀를 수정하고 정답을 계산할 때 필요합니다. .

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))); 

트릭 부기입니다 :

나는 원래 ALGOL60 구현보다 약간 더 읽기 자바 스크립트 번역, 검색 기능에 무엇을 참조 원인을있는 부작용 (변수 변경) 및 용어 원인에 올바른 기능 평가. 그러나 이전에 설명했듯이이 회계 장부는 지루합니다.

이 JavaScript 예제와 같은 최신 언어에는 이러한 부기 사례를 처리 할 올바른 해석기/컴파일러가 있습니다. ALGOL60 컴파일러가 만들어 졌을 때, 구현의 일부가 정확하지 않았습니다. 이 테스트는 올바르지 않은 구현과 올바른 구현을 분리하기 위해 수행되었습니다.