使用累加器存储答案 - 这将产生反向创建列表的效果(无需使用append
!)并产生尾递归解决方案。因为这看起来像家庭作业,所以我会给你一些提示,以便你填空:
(define (odd-reverse lst acc)
(cond ((null? lst) ; if the list is null
<???>) ; return the empty list
(<???> ; if there's only one element left in the list
(cons <???> acc)) ; cons that element with the accumulator
(else ; otherwise advance the recursion
(odd-reverse <???> ; advance two positions over the list
(cons <???> acc))))) ; cons current element with the acc
像这样称呼它:
(odd-reverse '(A B C D G) '())
=> '(G C A)
如果过程必须只接收一个参数(列表),那么编写另一个调用odd-reverse
总是将 a'()
作为累加器的初始值的过程是微不足道的。