Count-Syllables功能方案

时间:2018-04-10 13:02:38

标签: scheme racket

我想实现一个count-syllables过程,它以一个字母列表作为参数,并根据以下规则返回由字母组成的单词中的音节数:

音节数是元音的数量,除了一组连续的元音计为一个元音。元音是字母:

 (define vowels '(a e i o u))

示例:

       (count-syllables '(s o a r i n g)) ; output = 2 ('oa' and 'i')
        (count-syllables '(b e e p)) ; output = 1 ('ee')

我写了这段代码:

              (define count-syllables
                  (lambda (l)
                      (if (empty? l)
                          0
                       (if (memq (car l) '(a e i o u)) ; if we found a match
                               (+ 1 (count-syllables (cdr l)))
                                      (count-syllables (cdr l))))))

但是这个代码在输入'(s o a r i n g)时不会将连续的元音统计为一个 输出3并输入'(b e e p)时输出2

1 个答案:

答案 0 :(得分:2)

您需要考虑连续的元音,而不是每次找到元音时都加1。下面是一个如何使用相互递归处理这种情况的示例:

(define (count-syllables lst)
  (cond
    ((null? lst) 0)
    ((member (car lst) '(a e i o u))
     (+ 1 (skip-vowels (cdr lst))))
    (else
     (count-syllables (cdr lst)))))

(define (skip-vowels lst)
  (cond
    ((null? lst)
     (count-syllables '()))
    ((member (car lst) '(a e i o u))
     (skip-vowels (cdr lst)))
    (else
     (count-syllables lst))))

基本上,每次在列表中找到元音时,都会添加1,然后将该列表发送到skip-vowels,然后删除下一个连续的元音并将列表发送回count-syllables

然后你可以:

(count-syllables '(s o a r i n g))
=> 2
(count-syllables '(b e e p))
=> 1