我想实现一个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
答案 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