ho scritto Collatz congetture nello Schema:Perché la congettura collassica ricorsiva della coda causa uno straripamento dello stack in Scheme?
(define C
(lambda (n)
(cond
((eq? n 1) 1)
((even? n) (C (/ n 2)))
(else (C (+ (* n 3) 1))))))
Questa è una chiamata ricorsiva di coda, ma ottengo overflow dello stack quando chiamo (C 121):
guile> (trace C)
(C)
guile> (C 121)
[C 121]
[C 364]
[C 182]
[C 91]
[C 274]
[C 137]
[C 412]
[C 206]
[C 103]
[C 310]
[C 155]
[C 466]
[C 233]
[C 700]
[C 350]
[C 175]
[C 526]
[C 263]
[C 790]
[C 395]
[C 1186]
ERROR: Stack overflow
ABORT: (stack-overflow)
Perché è corretta ricorsione di coda causando un overflow? Come puoi vedere, sto usando Guile come interprete di Scheme (versione 1.8.7).
Cosa succede quando non si traccia la chiamata di funzione? Cosa succede quando usi un altro sistema di schemi? – knivil
La disabilitazione della traccia non aiuta. La racchetta funziona bene con l'esempio fornito. –
Questo potrebbe essere un bug: quella definizione sembra ricorsiva in coda. (La maggior parte delle librerie traccianti distruggerà comunque la ricorsione della coda.) –