这看起来像家庭作业,所以我会给你一些开始的提示。首先,让我们将问题拆分为两个过程 - 第一个过程将字符串转换为字符列表,并且还将定义我们要查找的字符列表。填空:
(define (has-vowel? str)
(any-in-list ; helper procedure, we'll get to this later
(<???> str) ; how to transform a string into a list of chars?
'(#\A #\a <???>))) ; list of vowels
有了上面的过程,我们就可以编写我们的辅助过程了any-in-list
。这是确定一个列表中的任何元素是否在另一个列表中的通用解决方案 - 将其视为判断两个列表的交集是否为非空的谓词:
(define (any-in-list lst check)
(cond (<???> <???>) ; if lst is empty, we didn't find any element, return #f
(<???> #t) ; return #t if the first element in lst is in check
(else (any-in-list <???> check)))) ; else advance the recursion over lst
棘手的部分在any-in-list
. 我们如何确定一个元素是否在另一个列表中?我们可以为此编写另一个帮助程序,但快速查看文档会让您走上正轨。并且不要忘记测试您的代码,这应该可以按预期工作:
(has-vowel? "whatever")
=> #t
(has-vowel? "trythnks")
=> #f