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

Scheme多函数调用错误:list-ref契约违规问题求助

修复Scheme递归函数中的list-ref合约违反问题

嘿,我看到你在写Scheme作业时遇到了list-ref: contract violation错误,这个问题我之前也碰到过——通常是因为你尝试用list-ref访问了超出列表范围的索引,或者传入的参数不是合法的非空列表。结合你给的代码片段和作业要求(禁止循环或begin),我来帮你重写并修复这个问题。

为啥会报错?

list-ref的规则很明确:第一个参数必须是非空列表,第二个参数必须是小于列表长度的非负整数。当你的递归走到列表末尾(变成空列表),或者剩余列表的长度比你要访问的索引还小时,再调用list-ref就会触发这个合约违反错误。所以我们得先在递归的终止条件里把这些情况拦住。

完整修复后的代码

假设你的extract-helper是要按指定间隔从列表中提取元素(比如每隔size个元素取一个),结合你已经写好的second函数,这里给出一个完全符合递归要求的实现:

(define (second lst)
  (cond [(and (list? lst) (not (null? lst)) (not (null? (cdr lst))))
         (first (rest lst))]
        [else '()]))

(define (extract-helper lst size counter)
  (cond
    ; 终止条件1:列表空了,直接返回空列表
    [(null? lst) '()]
    ; 终止条件2:剩下的列表不够长,没法继续提取,返回空
    [(< (length lst) counter) '()]
    ; 递归分支1:当前counter到1了,提取当前元素,然后递归处理剩余列表,counter重置为size
    [(equal? counter 1)
     (cons (first lst) (extract-helper (rest lst) size size))]
    ; 递归分支2:counter还没到1,跳过当前元素,递归处理下一个,counter减1
    [else
     (extract-helper (rest lst) size (- counter 1))]))

代码逻辑说明

  • 我加了两个关键的终止条件,确保在列表为空或者长度不足时直接返回空列表,彻底避免list-ref越界的情况
  • 整个实现完全用递归完成,没有用任何循环或者begin语句,符合作业要求
  • 如果你的extract-helper实际要实现的功能和我假设的不一样(比如是提取固定长度的子列表),可以补充说明具体需求,我再帮你调整代码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:49:42