Scheme合并列表及字符替换求助:拼接列表报错无有效返回
修复你的Scheme字符串替换代码
咱们先拆解下你代码里的核心问题,再一步步帮你修正:
关键问题梳理
- 语法错误:你写的
((append list (list '('abc'))))有多层多余括号,而且'('abc')这种写法完全不符合Scheme语法——要表示单个字符得用#\前缀(比如#\a),如果要添加"abc"对应的字符列表,直接写'(#\a #\b #\c)就可以。 - 未定义依赖:代码里用到了
start1函数但没给出定义,看起来你是想判断当前字符是不是'a',其实直接用(equal? (first tr) #\a)就能实现这个判断逻辑。 - 递归参数传递错误:你的递归调用
(uff (rest tr) liste)始终传递初始的空列表,没有把拼接后的新列表传进去,最后自然返回空字符串。 - 空输入处理逻辑:原代码里
(display "Kein Text eingegeben")是直接输出提示,但函数应该返回字符串而非执行display操作。
修正后的完整代码
(define (umwandl tr) (cond ((null? tr) "Kein Text eingegeben") ; 返回提示字符串,而非直接输出 ((string=? tr "") "Kein Text eingegeben") ; 额外处理空字符串场景 (else (uff (string->list tr) '())))) (define (uff tr liste) (cond ((null? tr) (list->string liste)) ; 递归终止:将结果列表转回字符串 ((equal? (first tr) #\a) ; 判断当前字符是否为'a' ; 把"abc"的字符列表拼接到结果列表,递归处理剩余字符 (uff (rest tr) (append liste '(#\a #\b #\c)))) (else ; 非'a'字符直接添加到结果列表,继续递归 (uff (rest tr) (append liste (list (first tr)))))))
代码功能解释
umwandl函数:先判断输入是否为空(包括空字符串),如果是则返回提示文本;否则将字符串转为字符列表,调用uff进行递归处理。uff函数:- 当字符列表处理完毕时,把累积的结果列表转回字符串。
- 如果当前字符是
#\a,就将"abc"对应的字符列表拼接到结果列表,再递归处理剩余字符。 - 如果是其他字符,直接将当前字符添加到结果列表,继续递归。
测试示例
(umwandl "") ; 返回 "Kein Text eingegeben" (umwandl "a") ; 返回 "abc" (umwandl "testa") ; 返回 "testabc" (umwandl "abac") ; 返回 "abcbaabcc"
内容的提问来源于stack exchange,提问作者JustAStudentThatNeedsHelp
相关产品推荐
相关产品推荐

