You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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))]))

代码说明

  1. 辅助函数find-lowest-uni专注于递归遍历列表,每次比较当前第一个元素和剩余列表的最低学费结构体,返回学费更低的那个结构体。
  2. 主函数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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 08:56:07