编写递归判断列表是否有序的函数时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
相关产品推荐
相关产品推荐

