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

编写递归判断列表是否有序的函数时define报错如何解决

列表有序判断函数的修复方案

报错原因

你遇到的define报错是语法错误导致的:

  • 代码中(string<? (first lst) second lst) 里的second lst没有用括号包裹,正确写法是(second lst),语法解析时把未加括号的这部分识别成了函数体外的额外表达式,就触发了对应的报错提示。

另外除了语法问题,你的递归逻辑也写反了:当前逻辑只要前两个元素满足升序就直接返回true,完全不会检查后续元素是否有序,会导致(list "A" "C" "B")这类测试用例判断错误。

修正后的完整代码

(check-expect (is-sorted? (list)) true)
(check-expect (is-sorted? (list "A")) true)
(check-expect (is-sorted? (list "B" "A")) false)
(check-expect (is-sorted? (list "A" "B")) true)
(check-expect (is-sorted? (list "A" "C" "B")) false)
(check-expect (is-sorted? (list "A" "B" "C")) true)

(define (is-sorted? lst)
  (cond
    ((empty? lst) true)
    ((empty? (rest lst)) true) ; 只剩一个元素时直接返回有序,无需计算length效率更高
    ((not (string<? (first lst) (second lst))) false) ; 前两个元素逆序直接返回无序
    (else (is-sorted? (rest lst))))) ; 前两个有序,递归检查剩余子列表

逻辑说明

  • 空列表、单元素列表默认是有序的,直接返回true
  • 每次递归先检查当前列表的前两个元素,如果逆序直接返回false,终止递归
  • 前两个元素有序的情况下,递归检查去掉第一个元素后的子列表是否有序

内容的提问来源于stack exchange,提问作者thatOneGuy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 13:45:05