求助:在Scheme中实现筛选包含指定字符的单词的`words-containing`函数
排查
words-containing函数的问题并修复 我来帮你看看代码里的问题,以及怎么修正它~
你的代码存在两个核心问题:
- 错误的比较逻辑:你写的
(equal? (car all-words) char)是把整个单词(一个字符列表,比如'(#\h #\i))和单个字符(比如#\i)做比较,这永远不会返回#t,因为两者类型都不一样。 - 没有收集符合条件的单词:不管判断结果如何,你的代码只是递归处理剩余列表,完全没把包含目标字符的单词加入结果里,自然得不到预期输出。
正确的实现方案
我们需要先检查当前单词里是否包含目标字符,如果包含就把它加入结果列表,再继续处理剩下的单词;如果不包含就直接处理剩下的单词。这里可以用Scheme内置的member函数来判断字符是否在单词列表中:
(define (words-containing all-words char) (cond [(empty? all-words) '()] ; 空列表直接返回空 [(member char (car all-words)) ; 检查当前单词是否包含目标字符 (cons (car all-words) (words-containing (cdr all-words) char))] ; 包含的话把单词加入结果,再递归处理剩余 [else (words-containing (cdr all-words) char)])) ; 不包含就直接递归处理剩余
示例验证
比如调用:
(words-containing '((#\a #\b) (#\c #\d) (#\x #\a #\y)) #\a)
会返回预期结果:'((#\a #\b) (#\x #\a #\y))
内容的提问来源于stack exchange,提问作者user15363327
相关产品推荐
相关产品推荐

