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

Scheme中如何返回符合校验条件的列表?作业实现求助

Scheme列表校验与返回实现

需求说明

需要编写一个Scheme函数,满足:

  • 输入为包含三个元素的结构(可以是列表,或三个独立参数)
  • 其中两个元素是正整数,且至少一个在1到3之间
  • 第三个元素是一个pair
  • 所有校验通过后,返回原输入列表(或由三个参数组成的列表)

原代码问题分析

你当前的代码存在几个关键问题:

  1. 参数是三个独立变量time、id、params,但需求是校验列表,若要处理列表需调整参数形式
  2. 缺少对params是否为pair的校验逻辑
  3. 条件满足时没有返回目标列表的语句
  4. else分支的(time id params)是错误写法,这会把time当作函数调用,而time是整数,会触发运行错误

实现方案

方案1:接收列表作为参数

直接处理完整列表,校验通过后返回原列表:

(define (validate-event lst)
  ; 先确保列表长度为3
  (if (= (length lst) 3)
      (let ((num1 (car lst))
            (num2 (cadr lst))
            (p (caddr lst)))
        ; 组合所有校验条件,满足则返回原列表,否则返回#f
        (and (integer? num1) (> num1 0)
             (integer? num2) (> num2 0)
             (or (<= 1 num1 3) (<= 1 num2 3))
             (pair? p)
             lst))
      #f))
  • 用let解构列表元素,简化校验逻辑
  • and会依次判断所有条件,全部满足时返回最后一个表达式lst(原列表),任意条件不满足则返回#f
  • 先检查列表长度,避免解构不存在的元素

方案2:接收三个独立参数,返回组合后的列表

如果需求允许函数接收三个独立参数,校验通过后返回它们组成的列表:

(define (event time id params)
  (and (integer? time) (> time 0)
       (integer? id) (> id 0)
       (or (<= 1 time 3) (<= 1 id 3))
       (pair? params)
       ; 校验通过,返回由三个参数组成的列表
       (list time id params)))
  • 同样利用and的特性,所有条件满足时返回(list time id params),否则返回#f

使用示例

; 合法输入,返回原列表
(validate-event '(2 5 '(a . b))) ; 输出: (2 5 (a . b))
(event 4 3 '(x . y)) ; 输出: (4 3 (x . y))

; 非法输入,返回#f
(validate-event '(0 2 '(a . b))) ; 输出: #f(0不是正整数)
(event 5 6 '(x . y)) ; 输出: #f(两个数都不在1-3之间)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 01:27:58