scheme函数检查常量/元音

时间:2013-02-26 23:48:04

标签: scheme racket

如何在Dr. Racket中创建一个函数会消耗一个字符串 str ,如果 str 至少有一个元音则生成true,如果 str 没有元音。

元音是以下字符集:A,a,E,e,I,i,O,o,U,u。

例如:

         (has-vowel? "whatever") => true 
         (has-vowel? "trythnks") => false

@ÓscarLópez 这是我到目前为止所提出的。函数可以是第一个字母是否是元音。我现在的问题是,我如何获得检查其他字母的功能?

我在Scheme 中一​​直收到此错误(其余:需要非空列表;给定“string”)

我不确切知道如何修复它。任何帮助/建议都是最受欢迎的。感谢。

2 个答案:

答案 0 :(得分:1)

这看起来像是家庭作业,所以我会给你一些提示来开始。首先,让我们在两个过程中分解问题 - 第一个将字符串转换为字符列表,并且还将定义我们正在寻找的字符列表。填写空白:

(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的第二行。我们如何确定元素是否在另一个列表中?我们可以为此编写另一个帮助程序,但快速查看documentation将使您正确进入正轨。并且不要忘记测试您的代码,这应该按预期工作:

(has-vowel? "whatever")
=> #t
(has-vowel? "trythnks")
=> #f

答案 1 :(得分:0)

一种解决方案是:

  1. 将字符串转换为字符列表(string->list
  2. 迭代列表并检查元音字符(characters