Scheme中如何返回符合校验条件的列表?作业实现求助
Scheme列表校验与返回实现
需求说明
需要编写一个Scheme函数,满足:
- 输入为包含三个元素的结构(可以是列表,或三个独立参数)
- 其中两个元素是正整数,且至少一个在1到3之间
- 第三个元素是一个pair
- 所有校验通过后,返回原输入列表(或由三个参数组成的列表)
原代码问题分析
你当前的代码存在几个关键问题:
- 参数是三个独立变量
time、id、params,但需求是校验列表,若要处理列表需调整参数形式 - 缺少对
params是否为pair的校验逻辑 - 条件满足时没有返回目标列表的语句
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
相关产品推荐
相关产品推荐

