Jan*_*rek 6 lisp stack-overflow scheme guile collatz
我在Scheme中写过Collatz猜想:
(define C
(lambda (n)
(cond
((eq? n 1) 1)
((even? n) (C (/ n 2)))
(else (C (+ (* n 3) 1))))))
Run Code Online (Sandbox Code Playgroud)
这是一个尾递归调用,但是当我调用时(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)
Run Code Online (Sandbox Code Playgroud)
为什么正确的尾递归会导致溢出?如您所见,我使用Guile作为Scheme解释器(版本1.8.7).
所定义的过程在 Racket 中运行良好。对我来说,这似乎是一个错误,或者是针对您的环境的特定问题。
几乎可以肯定与您的问题无关,但有点挑剔:使用(= n 1)数字比较而不是(eq? n 1).
| 归档时间: |
|
| 查看次数: |
699 次 |
| 最近记录: |