通过scheme中的列表反向工作

通过scheme中的列表反向工作,scheme,Scheme,我试图弄清楚如何在Scheme中使用递归以相反的顺序(从后到前)处理列表。我的研究表明,有一个反向函数可以在列表中使用,但我不想走这条路 我知道下面返回列表中的最后一个元素 (caddr '(1 5 3)) returns 3 我希望能够通过函数发送剩余的15,再次查看最后一个元素并重复,直到列表用尽 从左到右很简单,您可以查看列表中的car并发回cdr。首先执行递归调用,然后处理car。例如: (define (process-in-reverse lst fun) (when (not

我试图弄清楚如何在Scheme中使用递归以相反的顺序(从后到前)处理列表。我的研究表明,有一个反向函数可以在列表中使用,但我不想走这条路

我知道下面返回列表中的最后一个元素

(caddr '(1 5 3))
returns 3
我希望能够通过函数发送剩余的15,再次查看最后一个元素并重复,直到列表用尽


从左到右很简单,您可以查看列表中的car并发回cdr。

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

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

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

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


将问题分解为基本步骤、递归步骤以及它们的顺序。提示:如果先执行递归步骤,然后执行基,则将递归整个列表,然后处理基大小写,然后在堆栈展开时执行其余元素。函数
caddr
不会返回“列表”中的最后一个元素;它返回“您的列表”中的最后一个元素。
reverse
有什么问题吗?ppl-in应该会更上一层楼。如果不是我们,那是谁?这是一个很好的答案,为什么直到现在还没有投票?
(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)