2009-11-17 7 views
5

Kann jemand erklären, wie die Man Or Boy Test einen Wert von -67 zurückgibt?
Ich habe vergeblich versucht, das Ergebnis aufzuschreiben oder es mit einem Debugger zu verfolgen. Jede Hilfe wäre willkommen. Eine Liste der verschiedenen Implementierungen kann here gefunden werden.Wie funktioniert der "Man or Boy" Knuth-Test?

+0

Das klingt wie Hausaufgaben, können Sie erklären, wie die ersten 9 Iterationen funktionieren? Wenn Sie die ersten 4 tun können, dann zu bestimmen, wie es-67 wird, sollte einfach sein. Das könnte helfen, mehr Antworten zu bekommen, würde ich schätzen. –

+3

Ich hatte gehofft, eine Antwort von jemandem zu bekommen, der die Antwort bereits kannte. Wenn Sie denken, dass Sie der Aufgabe mit allen Mitteln gewachsen sind, aber das ist ganz bestimmt keine Hausaufgabe. Alle Verweise auf den Test, den ich finden kann, sagen: "Der Versuch, auf Papier zu arbeiten, ist wahrscheinlich fruchtlos" in der einen oder anderen Form. – CaptainCasey

Antwort

3

This is a nice page zu diesem Mann oder Junge Test. Es zeigt folgende interessante Fakten:

k = 10: A = -67 und A heißt 722 mal, B heißt (A - 1) mal.

ein komplettes calltrace zu schreiben ist ein bisschen nutzlos in diesem Fall, da die Funktion rekursive in der Natur, mit dem Zusatz, dass die Funktionen nicht reinen (wie Sie in der Haskell Übersetzung sehen können, ist es das erfordert Verwendung von STate-Monaden, gewickelt um k, um die Verunreinigung fernzuhalten): jeder Funktionsumfang (in diesem Fall die Variable k: es wird um Eins verringert) wird bei jedem Aufruf oder jeder Rekursion modifiziert und diese Modifikationen werden für die Berechnung der richtigen Antwort benötigt .

Ich finde die Übersetzung JavaScript ein bisschen mehr lesbar ist, als die ursprüngliche ALGOL60 Umsetzung:

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

Der Trick Buchhaltung ist: Welche Verweise auf Funktionen führen die Nebenwirkungen (Modifikation von Variablen) und in Begriff Ursache eine korrekte Funktionsbewertung. Diese Buchhaltung ist jedoch mühsam, wie ich bereits erläutert habe.

Moderne Sprachen, wie dieses JavaScript-Beispiel, haben korrekte Interpreter/Compiler für diese Fälle. Die Zeit ALGOL60 Compiler wurden gemacht, einige der Implementierungen waren nicht korrekt. Der Test wurde durchgeführt, um die falschen Implementierungen von den korrekten zu trennen.