Scheme使用foldr创建对列表而不使用显式递归

时间:2014-03-20 21:43:51

标签: scheme racket fold

我正在学习Scheme课程并且必须完成以下任务。我必须编写一个函数,它获得两个相同长度的列表A和B,并返回一个列表,其中每个项目都是两个项目的列表 - 一个来自A,另一个来自B。 例如,函数得到'(1 2 3)和'(4 5 6)并返回'((1 4)(2 5)(3 6))。 我可以使用这样的地图来做到这一点:

  

(define(func lst1 lst2)(map(lambda(x y)(list x y))lst1 lst2))

但问题是通过foldr和没有显式递归来做到这一点。

任何人都可以帮助我吗?我不知道怎么做.... 谢谢!

1 个答案:

答案 0 :(得分:5)

诀窍是知道要传递什么作为函数参数,这里是如何:

(define (func l1 l2)
  (foldr (lambda (e1 e2 acc)
           (cons (list e1 e2) acc))
         '()
         l1 l2))

请注意,我们在foldr末尾传递两个列表,因此lambda需要三个参数:当前第一个列表中的元素(e1),第二个列表中的当前元素(e2)和累积输出(acc),以值'()开头。其余的很简单,只需使用conslist构建输出。它按预期工作:

(func '(1 2 3) '(4 5 6))
=> '((1 4) (2 5) (3 6))