2012-03-16 63 views
6

he escrito Collatz conjeturas en el Esquema:¿Por qué es la conjetura de Collatz recursiva de la cola que causa el desbordamiento de la pila en Scheme?

(define C 
    (lambda (n) 
    (cond 
    ((eq? n 1) 1) 
    ((even? n) (C (/ n 2))) 
    (else (C (+ (* n 3) 1)))))) 

Esta es una llamada recursiva de cola, pero me sale desbordamiento de pila cuando llamo (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) 

¿Por qué es adecuado recursión de cola causando un desbordamiento? Como puede ver, estoy usando Guile como intérprete de Scheme (versión 1.8.7).

+0

¿Qué sucede cuando no se rastrea la llamada a la función? ¿Qué sucede cuando usas otro sistema de esquema? – knivil

+0

Deshabilitar el rastreo no ayuda. Raqueta está bien con el ejemplo dado. –

+7

Esto podría ser un error: esa definición parece recursiva a la cola. (Sin embargo, la mayoría de las bibliotecas de rastreo destruirán la recursividad de cola). –

Respuesta

2

El procedimiento definido funciona bien en Racket. Me parece un error, o algo muy específico de tu entorno.

Casi con certeza no está relacionado con su problema, pero un poco de picada: use la comparación (= n 1) para números en lugar de (eq? n 1).

0
(define C 
    (lambda (n) 
    (cond 
    ((eq? n 1) 1) 
    ((even? n) (C (/ n 2))) 
    (else (C (+ (* n 3) 1)))))) 

Esto parece que siempre devuelve 1 (o bucles infinitamente - la conjetura no se ha comprobado). ¿Hay algún error de transcripción que oculte (+1 ...) en las llamadas recursivas?

Cuestiones relacionadas