2011-05-25 35 views

回答

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,并且每次累积xcar的值。停止条件是迭代变量为空时,返回值为总和。好吧,除了方括号的球拍偏好外,这看起来不错。有一个do循环和一个列表。循环在该列表上做了些什么。我们可以用它来写一个查找特定原子在列表的功能(使用球拍支架):

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

相反初始化和增加值sum的,我orfound。另外,我更喜欢firstrest而不是carcdr,并且在他们不存在时自己定义它们。这个函数的工作方式应该从示例的解释开始。

(find5 '(1 2 3 4 6)) 

给出#f,如预期。同样地:

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

给#t。

您是否能够推广在查找列表中的某个特定元素,并将do循环放入您的特定问题?

+0

是的,谢谢你的答案。我在计划中并不熟悉cicle,我试图理解,但我只理解简单的函数,但是昨天我需要做一个函数,看看元素是否在第二个列表中。我无法做到这一点,因为在不了解停工条件。 – gn66 2011-05-26 08:00:04

相关问题