(方案)使用 do cicle 验证一个列表中的元素是否在第二个列表中

发布于 2024-11-09 17:20:32 字数 47 浏览 3 评论 0原文

我们如何在方案中使用 do cicle 验证第一个列表的元素是否在第二个列表中?

How do we verify in scheme with the do cicle, if an element of the first list is in the second?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

帝王念 2024-11-16 17:20:32

racket 中的 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,然后每次循环迭代设置为自身的cdr 。 sum初始化为0,每次累加xcar的值。停止条件是迭代变量为空,返回值是和。

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

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

我不是初始化并添加值 sum,而是 or 到 <代码>找到。另外,我更喜欢 firstrest 而不是 carcdr,并在它们不存在时自己定义它们。该函数的工作方式应遵循示例的解释。

(find5 '(1 2 3 4 6))

正如预期的那样,给出#f。同样:

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

给出#t。

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

The do loop in racket has an interesting structure:

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

The documentation for r5rs provides an example:

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

That statement returns 25, the sum of the elements of the loop. The x in the do loop is initialized to the x in the let, and then iteratively set to the cdr of itself each time through the loop. sum is initialized to 0, and accumulates the value of the car of x each time through. The stopping condition is when the iteration variable is empty, and the return value is the sum.

Ok, aside from the racket preference of square brackets, this looks good. There's a do loop and a list. The loop does something over that list. We can use that to write a function that finds a specific atom in a list (using the racket brackets):

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

Instead of initializing and adding the value sum, I or into found. Also, I prefer first and rest over car and cdr and define them myself when they don't exist. The way this function works should follow from the explanation of the example.

(find5 '(1 2 3 4 6))

Gives #f, as expected. Similarly:

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

Gives #t.

Are you able to generalize finding a specific element in a list with a do loop into your specific question?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文