Scheme中实现字符串元音移除时遇string?参数错误如何解决?
错误原因分析
string?是判断输入是否为字符串类型的谓词,仅支持1个入参,你传入了多个参数不符合函数定义,是直接报错的原因- 调用
string->list把字符串转为列表后,列表内的每个元素是字符类型,不是字符串类型,本身就不能用string?做匹配判断 - 原有逻辑还存在两处问题:
- 列表只剩一个元素时直接返回空,会丢失最后一个非元音字符
- 匹配到元音后的递归调用错用了接收字符串参数的
devowel,应该调用处理字符列表的devowel/list
修复后代码
(define (devowel str) (list->string (devowel/list (string->list str)))) (define (devowel/list char-list) (cond [(empty? char-list) empty] [else (let ([current (first char-list)]) ; 判断当前字符是否为元音(覆盖大小写) (if (or (equal? current #\a) (equal? current #\e) (equal? current #\i) (equal? current #\o) (equal? current #\u) (equal? current #\A) (equal? current #\E) (equal? current #\I) (equal? current #\O) (equal? current #\U)) ; 是元音则跳过,直接处理剩余字符 (devowel/list (rest char-list)) ; 非元音则拼接当前字符后处理剩余 (cons current (devowel/list (rest char-list)))))])) (devowel "apple") ; 运行结果为 "ppl"
注:实现仅用到了要求的
list->string和string->list两个指定函数,其余equal?、or、cond等都是Scheme基础语法/通用基础谓词,不在限制范围内。
内容的提问来源于stack exchange,提问作者qian
相关产品推荐
相关产品推荐

