通过计划中的列表向后工作

时间:2014-02-10 17:33:27

标签: scheme

我正试图弄清楚如何使用递归在Scheme中以相反的顺序(返回前面)处理列表。我的研究表明,你可以在列表中使用反向功能,但我不想走那条路。

我知道以下内容会返回列表中的最后一个元素;

(caddr '(1 5 3))
returns 3

我希望能够通过该功能发送剩余的1 5,再次查看最后一个元素并重复直到列表用尽

从左到右很简单,你看看列表中的车并发回cdr。

1 个答案:

答案 0 :(得分:2)

首先进行递归调用,然后处理car。例如:

(define (process-in-reverse lst fun)
  (when (not (null? lst))
    (process-in-reverse (cdr lst) fun)
    (fun (car lst))))

然后

> (process-in-reverse '(1 5 3) display)
351

如果您只想反转结果,并且后续调用独立于先前的调用,则累加器将执行并且是尾递归的:

(define (process-reverse-result lst fun)
  (let loop ((lst lst) (res null))
    (if (null? lst)
        res
        (loop (cdr lst) 
              (cons (fun (car lst)) res)))))

然后

> (process-reverse-result '(1 5 3) add1)
'(4 6 2)