运行Scheme自定义取列表最大值函数出现>合约违反错误如何解决
问题原因
报错核心原因是误用逗号作为列表元素分隔符:
- Scheme 里只用空格做元素分隔,逗号是特殊语法关键字(对应
unquote操作),仅能在准引号场景使用 - 你写的
'(5, 3, 8, 2)实际解析出来的列表包含,3、,2这类非数值元素,调用>比较时就触发了要求实参为实数的合约错误。
修正方法
直接去掉函数调用时列表里的所有逗号,用空格分隔即可:
(define (get_max list) ; 只剩一个元素时直接返回 (if (null? (cdr list)) (car list) ; 第二个元素大于第一个就去掉第一个递归,否则去掉第二个递归 (if (> (car (cdr list)) (car list)) (get_max (cdr list)) (get_max (cons (car list) (cdr(cdr list)))) ))) ; 修正后的调用 (get_max '(5 3 8 2))
修改后运行即可得到正确结果8,你原本的函数逻辑没有问题。
可选优化
可以增加边界校验和语法优化,提升代码鲁棒性和可读性:
(define (get_max list) (cond ((null? list) (error "get_max: 不能传入空列表")) ((null? (cdr list)) (car list)) ((> (cadr list) (car list)) (get_max (cdr list))) (else (get_max (cons (car list) (cddr list))))))
这里用cond替换嵌套if结构,用cadr/cddr简化嵌套的列表操作写法。
内容的提问来源于stack exchange,提问作者majestic_cheeto
相关产品推荐
相关产品推荐

