【发布时间】:2017-02-12 01:48:07
【问题描述】:
在 Racket 中,可以在另一个过程中定义一个过程和常量,例如:
(define (a a-list)
(define something 10)
(display a-list)
(cond
[(empty? a-list) (display "done")]
[else
(display a-list) (newline)
(a (rest a-list))]))
打印列表,然后取出第一个元素,然后再次打印列表,以此类推,直到列表为空。
在示例过程中,值something 被定义为10,无论出于何种原因。当过程递归时,Racket 是否再次定义该值,或者它是否足够聪明地注意到这个定义没有改变?
它也可能在先前调用的过程的堆栈空间上,如果这没有优化,并且每个递归步骤会消耗更多的内存,这取决于 something 的定义。例如,假设列表中有一百万个数字,但从不改变数字。显然,如果该定义中的内容依赖于作为参数给出的列表,则不能如此简单地对其进行优化。
如果这没有优化,那么在递归函数中不要有太多的define 形式是一个好主意,还是只有那些消耗很少空间的形式?将它们放在过程之外将使它们可以从其他过程中访问,即使只有一个过程曾经使用它们。
【问题讨论】:
标签: recursion optimization racket