Recursion I';我正在做一些涉及递归函数和I';我很困惑
对于我的类,我需要编写一个接受字符串的函数,并在字符串中找到的每个辅音后添加“op” 到目前为止,我得到的是一个helper函数,它检查单个字母,看它是辅音还是元音。这是:Recursion I';我正在做一些涉及递归函数和I';我很困惑,recursion,scheme,Recursion,Scheme,对于我的类,我需要编写一个接受字符串的函数,并在字符串中找到的每个辅音后添加“op” 到目前为止,我得到的是一个helper函数,它检查单个字母,看它是辅音还是元音。这是: (define (check-letter letter) (if (null? letter) 'empty (or (char=? letter #\a) (char=? letter #\e) (char=? letter #\i) (char=? letter #\o) (char=? let
(define (check-letter letter)
(if (null? letter)
'empty
(or (char=? letter #\a) (char=? letter #\e)
(char=? letter #\i) (char=? letter #\o)
(char=? letter #\u) (char=? letter #\y))))
因此,这将给我一封信的正确或错误,但我不知道如何处理问题的其余部分
我知道我需要使用“string->list”函数,但我对递归函数非常不熟悉
如果有人能帮我指出正确的方向,或者在互联网上的某个地方,这将是非常棒的,所以你的初始程序会检查字符是否是元音。该参数是一个字符,此处无需检查
null
。另外,它是一个谓词(返回true或false),所以我们称它为元音?
:
(define (vowel? letter)
(or (char=? letter #\a) (char=? letter #\e)
(char=? letter #\i) (char=? letter #\o)
(char=? letter #\u) (char=? letter #\y)))
将字符串转换为列表并返回的包装函数非常简单:
(define (add-op str op)
(list->string
(add-op-list (string->list str) op)))
现在是递归函数,处理列表。您知道列表的结构如下:
`(cons elt1 (cons elt2 (cons elt3 (cons elt4 (.... (cons '() ))))))`
递归性意味着
car
获得),并对列表的其余部分调用相同的过程(通过cdr
获得)null?
,因此添加最后的”()
)(define (add-op-list lst op)
(if (null? lst) ; list is empty: finally add '()
'()
(let ((c (car lst))) ; c is the first element of the list
(if (vowel? c) ; is it a vowel?
(cons c (add-op-list (cdr lst) op)) ; yes, just add it to the resulting list and proces the rest
(cons c (cons op (add-op-list (cdr lst) op))))))) ; no, add c and op
尝试:
> (add-op "Supercalifragilisticexpialidocious" #\!)
"S!up!er!c!al!if!r!ag!il!is!t!ic!ex!p!ial!id!oc!ious!"
下面是一个尾部递归解决方案(你的老师肯定会给你额外的学分,因为你使用了尾部递归!)
(define (vowel? c)
(member c '(#\a #\e #\i #\o #\u #\y)))
(define (homework-1 string punc)
(let extending ((letters (string->list string)) (result '()))
(cond ((null? letters)
(list->string (reverse result)))
((vowel? (car letters))
(extending (cdr letters)
(cons (car letters) result)))
(else
(extending (cdr letters)
(cons punc (cons (car letters) result))))
> (homework-1 "abc" #\-)
"ab-c-"