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.
- 1. Come specificare il database per Factory Boy?
- 2. Come funziona il test dell'unità su iPhone?
- 3. Laravel - capire come funziona il test
- 4. Datomic - funziona con la clausola OR
- 5. Man mano dispatchEvent DOMContentLoaded
- 6. Come funziona `if (Test-Path ...)` funziona davvero?
- 7. DFA costruzione nell'algoritmo di Knuth-Morris-Pratt
- 8. Diventare il team one-man più efficiente
- 9. Algoritmo di Knuth-Morris-Pratt in Haskell
- 10. Il modo migliore per creare pagine man?
- 11. Come ottenere pagine man di OpenGL su Ubuntu come in "man glRotate"?
- 12. Dov'è il programma "man" per Windows (programma per aprire le pagine man UNIX)?
- 13. come funziona il timeout nei test angolari in karma
- 14. sqlite "insert or replace" funziona con la chiave primaria AUTOINCREMENT?
- 15. notazione sinossi della pagina man
- 16. $ (this) OR event.target OR var input = $ (this)
- 17. Anteprima man-page senza installazione pacchetto
- 18. Algebra di tipo e notazione della freccia su di Knuth
- 19. lettura PHP pagine man in Vim
- 20. Rspec, il test per il controller di aggiornamento non funziona?
- 21. Come funziona il meccanismo Garbage Collection?
- 22. Output '{' or '}' con string.format (...)
- 23. NSManagedObject non funziona isKindOfClass test
- 24. Come usare OR logico in SPIRQL regex()?
- 25. Alternativa all'istruzione OR
- 26. Come viene valutata l'espressione operatore OR
- 27. Come posso creare un'istruzione "OR" in ActiveRecord?
- 28. Umbraco: funziona con il controllo della versione? test/produzione?
- 29. Yii2 Come eseguire il raggruppamento delle condizioni AND o OR?
- 30. Istruzione [Multi] DataTrigger "OR"?
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