在方案中递归创建列表

时间:2013-12-28 08:01:23

标签: list recursion scheme racket tail-recursion

我再次提出我的奇怪计划问题。

我有一个定义,从列表中删除子元素(基于搜索匹配)并生成没有它的新列表(基于此答案here)。

(func '1 mylist) ; will return mylist without all sublists containing 1

一切正常,直到我意识到我需要为另一个列表中的每个元素重复我的定义。

我递归地调用它,但是每次调用我都使用原始列表,而不是之前的过滤。

或者用另一个词我想实现这个目标:

(define filterList '(1 2 3))

(func '3 (func '2 (func '1 mylist) ); list without all sublists containig 1 2 3

我总是卡住了。谢谢大家的帮助。

1 个答案:

答案 0 :(得分:2)

这是要从初始列表(lst)中删除的元素列表(elts)的基本循环:

(define (func2 elts lst)
  (if (null? elts)
      lst
      (func2 (cdr elts) (func (car elts) lst))))

然后

(func2 '(1 3) '(1 2 3))
=> '(2)

或者,在球拍中:

(define (func2 elts lst)
  (for/fold ((res lst)) ((e (in-list elts)))
    (func e res)))