2009-11-17 12 views
5

Qualcuno può spiegare come lo Man Or Boy Test restituisca un valore di -67?
Ho cercato invano di annotare il risultato o di tracciarlo con un debugger. Qualsiasi aiuto sarebbe apprezzato.
un elenco di diverse implementazioni può essere trovato here.Come funziona il test Knuth "Man Or Boy"?

+0

Questo suona come compiti a casa, si può spiegare come funzionano i primi 9 iterazioni? Se riesci a fare i primi 4, allora per determinare come ottiene -67 dovrebbe essere facile. Ciò potrebbe aiutare a dare più risposte, immagino. –

+3

Speravo di ottenere una risposta da qualcuno che già conosceva la risposta. Se pensi di essere all'altezza del compito con tutti i mezzi, ma questo non è certamente compito a casa. Tutti i riferimenti al test che posso trovare dicono "Cercare di lavorare sulla carta è probabilmente infruttuoso" in una forma o nell'altra. – CaptainCasey

risposta

3

This is a nice page su questo uomo o il test di un ragazzo. Essa mostra i seguenti fatti interessanti:

k = 10: A = -67 e A è detto 722 volte, B è chiamata (A - 1) volte.

Scrivi calltrace completo è un po 'inutile, in questo caso, in quanto la funzione è ricorsiva in natura, con l'aggiunta che le funzioni non sono puro (come si può vedere nella traduzione Haskell, esso richiede la uso di state Monadi, avvolto intorno k, per mantenere l'impurità di distanza): portata di ciascuna funzione (in questo caso la variabile k: è diminuito di uno) viene modificato ogni chiamata o ricorsione e queste modifiche sono necessarie per il calcolo della risposta corretta .

trovo la traduzione JavaScript un po 'più leggibile, che l'attuazione ALGOL60 originale:

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

Il trucco è la contabilità: ciò che i riferimenti alle funzioni di causa che gli effetti collaterali (modifica delle variabili) e in cause termine una corretta valutazione della funzione. Tuttavia, questa contabilità è noiosa, come ho spiegato prima.

lingue moderne, come ad esempio questo esempio JavaScript, hanno corretti interpreti/compilatori per gestire questi casi contabilità. Al momento della compilazione dei compilatori ALGOL60, alcune delle implementazioni non erano corrette. Il test è stato fatto per separare le implementazioni errate da quelle corrette.

Problemi correlati