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