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"?
risposta
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.
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. –
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