递归还是迭代?
递归可以让很多算法有良好的可读性, 但在某些情况下效率却低下. newLISP 有很多的迭代构造器和高阶函数,比如 flat 或者系统自带的 XML 函数, 其内部使用递归. 大部分情况下,没有必要自己定义递归算法。.
有时,非递归解决方案可以更快、更节省系统资源。.
; classic recursion
; slow and resource hungry
(define (fib n)
(if (< n 2) 1
(+ (fib (- n 1))
(fib (- n 2)))))
上面的递归方案,由于频繁的调用开销执行很慢。递归解决方案使用了大量内存来保存递归调用中的中间结果和冗余结果。
; iteration
; fast and also returns the whole list
(define (fibo n , f)
(set 'f '(1 0))
(dotimes (i n)
(push (+ (f 0) (f 1)) f)) )
上面的迭代解决方案速度快,占用的内存少。
网友评论