【发布时间】:2015-03-21 22:26:23
【问题描述】:
在弄清楚这个算法的递归版本之后,我正在尝试创建一个迭代(尾递归)版本。
我已经很接近了,但是返回的列表最终被颠倒了。
这是我目前所拥有的:
(define (first-n-iter lst n)
(define (iter lst lst-proc x)
(cond
((= x 0) lst-proc)
(else (iter (cdr lst) (cons (car lst) lst-proc) (- x 1)))))
(if (= n 0)
'()
(iter lst '() n)))
即调用(first-n-iter '(a b c) 3) 将返回(c b a)。
有人可以提出解决办法吗?再一次,我想保留尾递归。
注意:我不希望你建议只在返回的列表上调用 (reverse lst)..
【问题讨论】:
-
但是,在结果上调用 reverse 是实现这一点的标准方法。
-
真的吗?我没有意识到这一点。我希望我可以通过使用
conscar和cdr来实现它,但如果真的是这样,那么我将不得不忍受它。 -
确实如此。由于
reverse以这种方式使用,许多实现提供了非常快速的reverse的内置版本。