gpt4 book ai didi

scheme - 使用 `map` 的 Racket 计数出现次数

转载 作者:行者123 更新时间:2023-12-01 12:16:49 25 4
gpt4 key购买 nike

Write a Racket function count-occurrences that consumes two lists of symbols and produces a list of natural numbers measuring how many times items in the first list occur in the second list. For example:

(count-occurrences (list 'a 'b 'a 'q) (list 'r 'a 'b 'e 'b 'g))

=> (list 1 2 1 0)

我一直在为这个问题苦苦挣扎 - 我该如何使用 map 来做,因为对于这个问题,它指定我们不能使用递归。

我最初的想法是执行以下操作:

(define (count-occurrences los1 los2) 
(map
(length (filter (lambda (x) (symbol=? x (first los1))) los2))
los1))

但是在这里使用length 只能让我们得到'a 发生的数字,而不是进入递归。对于抽象函数,内部函数只能有一个参数,所以我完全迷路了。

最佳答案

如果 ... x ... 是一个开放公式,即引用一个未绑定(bind)变量的表达式 x,将其包装在 lambda 形式中使其成为 x 中的函数,如下所示:

(lambda (x) ... x ... )

其中 x 被该 lambda 形式绑定(bind);这个所谓的 lambda 函数的一个参数,也就是说,一个由 lambda 形式引入的匿名函数。

因此,解决您的问题非常简单:认识到这一点

    (length
(filter (lambda (x)
(symbol=? x (first los1)))
los2))

实际上应该是

    (length
(filter (lambda (x)
(symbol=? x y))
los2))

其中y依次指代los1中的每个元素,只是第一个;然后它是 y 中的一个开放公式——也就是说,y 是未绑定(bind)的,自由。所以我们必须捕获它,并使其绑定(bind),通过......是的,将这个表达式包含在 lambda 形式中,从而使它成为一个函数 in y!像这样:

  (lambda (y)
(length
(filter (lambda (x)
(symbol=? x y))
los2)))

this 是映射到 los1 上的内容。

通过这个简单的调整,您的代码将成为一个正确的、有效的函数定义。

关于scheme - 使用 `map` 的 Racket 计数出现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47515819/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com