(scheme)验证一个列表中的元素是否在带有do cicle的第二个列表中

时间:2011-05-25 19:08:02

标签: scheme racket

如果第一个列表的元素在第二个列表中,我们如何在方案中验证do cicle?

1 个答案:

答案 0 :(得分:5)

球拍中的do循环有一个有趣的结构:

(do ([id init-expr step-expr-maybe] ...)
    (stop?-expr finish-expr ...)
  expr ...)

r5rs的文档提供了一个示例:

(let ((x '(1 3 5 7 9)))
  (do ((x x (cdr x))
       (sum 0 (+ sum (car x))))
      ((null? x) sum)))

该语句返回25,循环元素的总和。 do循环中的x初始化为let中的x,然后每次循环时迭代地设置为cdrsum初始化为0,每次累计car x的值。停止条件是迭代变量为空时,返回值为总和。

好吧,除了方括号的球拍偏好外,这看起来还不错。有一个do循环和一个列表。循环在该列表上做了一些事情。我们可以用它来编写一个在列表中找到特定原子的函数(使用球拍括号):

(define (find5 lst)
  (do ([x lst (rest x)]
       [found #f (or found (eq? 5 (first x)))])
    ((null? x) found)))

而不是初始化值sum并将or添加到found。另外,我更喜欢firstrest而不是carcdr,并在不存在时自己定义它们。此函数的工作方式应遵循示例的说明。

(find5 '(1 2 3 4 6))

按预期给出#f。类似地:

(find5 '(1 2 3 4 5 6))

给#t。

您是否能够概括地在列表中找到特定元素并在您的特定问题中使用do循环?