使用成员的球拍列表

时间:2013-02-27 04:50:07

标签: racket

在大约10个小时内完成一些作业工作时我遇到了一些问题。

我应该创建一个函数has-vowels?它会消耗字符串并返回true或false,具体取决于字符串是否有元音。

示例(has-vowels?“哇”) - >真正 (has-vowels?“nwtfg” - > false

所以这就是我所做的,

(define vowel-list (cons #\A 
               (cons #\a 
               (cons #\E 
               (cons #\e
               (cons #\I 
               (cons #\i
               (cons #\O 
               (cons #\o 
               (cons #\U
               (cons #\u empty)))))))))))

(define (a-vowel? vowels)
  (cond ((empty? vowels) true)
    ((member (first vowels) vowel-list) true)
    (else false )))

(define (has-vowels? word)
  (a-vowel? (string->list word)))

问题是“oio”是真的而“www”是假的,但混合字符串如“哇”也是假的?

任何提示或提示?

谢谢!

4 个答案:

答案 0 :(得分:1)

你没有检查剩下的单词,只检查第一个字母。因此“oio”有效,因为o是元音,“www”失败,因为w不是,“哇”也失败,因为w不是元音。

作为提示,您需要修改当列表不为空且第一个字母不是元音时会发生什么。目前你只是返回false。

答案 1 :(得分:1)

您的代码没有任何意义。首先,您必须解释基本情况。如果它是空的,它应该返回false。

(空?元音)真)是错的。在这里你要说它应该返回true,如果它是空的,这是不正确的。

同样如上文Warwick Masson所述,您只测试第一个字母。要测试另一个字母,你必须在列表中的其他项目上使用递归,继续迭代,直到你完成所有字母。

祝你好运!

答案 2 :(得分:0)

以下是完整的解决方案:

;; contains-vowel? : string -> boolean
;; checks whether a string contains a vowel.
(define (contains-vowel? a-string)
  (local (;; A list of vowels
          (define vowel-list 
           (list #\A #\a #\E #\e #\I #\i #\O #\o #\U #\u))
          ;; split-string : string -> (listof string-pieces)
          ;; converts a string into a list of string pieces.
          (define (split-string a-string)
            (string->list a-string))
          ;; has-vowel? : string-piece -> booleal
          ;; checks whether a string-piece is a vowel
          (define (has-vowel? string-piece vowels)
            (cond ((empty? vowels) false)
                  ((equal? string-piece (first vowels)) true)
                  (else (has-vowel? string-piece (rest vowels)))))
          ;; contains-vowel-list : (listof string-pieces) -> boolean
          ;; determines whether any items on a list of string-pieces
          ;; contains a piece that represents a vowel.
          (define (contains-vowel-list losp)
            (cond ((empty? losp) false)
                  ((false? (has-vowel? (first losp) vowel-list))
                   (contains-vowel-list (rest losp)))
                  (else (has-vowel? (first losp) vowel-list)))))
          (contains-vowel-list (split-string a-string))))
;; Test
(check-expect (contains-vowel? "hellk") true)
(check-expect (contains-vowel? "hhllo") true)
(check-expect (contains-vowel? "ellhh") true)
(check-expect (contains-vowel? "hhhssdd") false)

我假设你使用cons,你可能还不允许使用本地表达式或列表缩写。这个解决方案可能更适合您的作业:

;; A list of vowels
(define vowel-list (cons #\A 
           (cons #\a 
           (cons #\E 
           (cons #\e
           (cons #\I 
           (cons #\i
           (cons #\O 
           (cons #\o 
           (cons #\U
           (cons #\u empty)))))))))))
;; split-string : string -> (listof string-pieces)
;; converts a string into a list of string pieces.
(define (split-string a-string)
  (string->list a-string))
;; Test
(check-expect (split-string "ja") (cons #\j (cons #\a empty)))
;; has-vowel? : string-piece -> boolealn
;; checks whether a string-piece is a vowel
(define (has-vowel? string-piece vowels)
  (cond ((empty? vowels) false)
        ((equal? string-piece (first vowels)) true)
        (else (has-vowel? string-piece (rest vowels)))))
;; Test
(check-expect (has-vowel? #\i vowel-list) true)
(check-expect (has-vowel? #\x vowel-list) false)
;; contains-vowel-list : (listof string-pieces) -> boolean
;; determines whether any items on a list of string-pieces
;; contains a piece that represents a vowel, from a list of vowels.
(define (contains-vowel-list losp)
  (cond ((empty? losp) false)
        ((false? (has-vowel? (first losp) vowel-list))
         (contains-vowel-list (rest losp)))
        (else (has-vowel? (first losp) vowel-list))))
;; Test
(check-expect (contains-vowel-list (cons #\h (cons #\i empty))) true)
(check-expect (contains-vowel-list (cons #\h (cons #\h empty))) false)
;; contains-vowel? : string -> boolean
;; checks whether a string contains a vowel.
(define (contains-vowel? a-string)
  (contains-vowel-list (split-string a-string)))
;; Test
(check-expect (contains-vowel? "hellk") true)
(check-expect (contains-vowel? "hhllo") true)
(check-expect (contains-vowel? "ellhh") true)
(check-expect (contains-vowel? "hhhssdd") false)

答案 3 :(得分:0)

您是否只能使用某些特定功能? 你可以使用regexp来做这类事情。

(define vowels? 
 (lambda (list-to-evaluate)
   (if (list? (regexp-match-positions #rx"[AaEeIiOoUu]" (list->string list-to-evaluate)))
       #t
       #f
  )))

当然(列表评估) 有表格

(#\A #\p #\p #\l #\e)

否则你可以改变

list-to-evaluate

以简单的字符串“Hello World”为例。

(vowels? '(#\A #\p #\p #\l #\e)) ==> true