BSL Racket求最低学费大学名称的递归函数报错解决
修正BSL Racket中
lowest?函数的递归实现问题 错误原因分析
你的代码报错是因为递归调用lowest? (rest lou)返回的是大学名称(字符串类型),但你试图将这个字符串传入uni-tuition函数——而uni-tuition的参数要求是uni结构体,自然会抛出类型不匹配的错误。
比如第三个测试用例中,递归处理(cons (make-uni "UVIC" 26000) empty)时,lowest?返回的是字符串"UVIC",之后你执行(uni-tuition "UVIC"),这完全不符合函数的参数要求。
修正方案(保持递归特性)
核心思路是:让递归过程中传递和比较的是完整的uni结构体,而不是提前返回名称。可以通过编写辅助递归函数来实现,主函数只负责处理空列表的特殊情况,以及最终提取结果的名称。
修正后的代码
(define (lowest? lou) ; 辅助递归函数:找到列表中学费最低的uni结构体 (define (find-lowest-uni lou) (cond [(empty? (rest lou)) (first lou)] [else (let ([rest-lowest (find-lowest-uni (rest lou))]) (if (< (uni-tuition (first lou)) (uni-tuition rest-lowest)) (first lou) rest-lowest))])) ; 主逻辑:处理空列表,或提取最低学费大学的名称 (cond [(empty? lou) "none"] [else (uni-name (find-lowest-uni lou))]))
代码说明
- 辅助函数
find-lowest-uni专注于递归遍历列表,每次比较当前第一个元素和剩余列表的最低学费结构体,返回学费更低的那个结构体。 - 主函数
lowest?只做两件事:- 如果输入列表为空,返回"none";
- 否则调用辅助函数找到最低学费的
uni结构体,再用uni-name提取名称返回。
测试验证
运行你的三个测试用例:
(lowest? empty)→ 返回"none",符合预期;(lowest? (cons (make-uni "UBC" 28500) empty))→ 返回"UBC",符合预期;(lowest? (cons (make-uni "SFU" 27797) (cons (make-uni "UVIC" 26000) empty)))→ 辅助函数先返回UVIC的结构体,和SFU比较后仍返回UVIC,最终提取名称得到"UVIC",符合预期。
内容的提问来源于stack exchange,提问作者BTDN
相关产品推荐
相关产品推荐

