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

如何用Scheme编写判断列表是否为配对元素列表的代码?

问题解决:判断列表是否为配对元素列表的Scheme代码修正

一、先解决调用时的参数不匹配错误

你调用代码的问题有两个:

  1. 函数名拼写错误:把list-of-pairs?拆写成了list-of pairs?,Scheme会将list-of识别为一个独立函数,把pairs?、后续的list表达式等当成多个参数传入,导致参数数量不匹配。
  2. 缺少右括号:调用代码的末尾少了一个闭合括号。

修正后的调用代码:

(list-of-pairs?
 (list
  (cons 1 (cons 2 empty))
  (cons 2 (cons null empty))
  (cons 3 (cons 4 (list 4 5 6)))))

二、修正原函数的逻辑错误

你原代码的逻辑完全不符合需求,问题点:

  • 空列表返回#f,但空列表是合法的配对元素列表(没有元素违反“所有元素都是pair”的规则)。
  • 错误检查(cdr lst)是否为pair,而不是检查当前列表的第一个元素(car lst)是否为pair。
  • 递归时跳过了下一个元素(用cddr lst),应该递归检查剩余的整个子列表(cdr lst)。

正确的实现代码

用cond结构的版本更清晰:

(define (list-of-pairs? lst)
  (cond
    ((null? lst) #t)                    ; 空列表满足条件
    ((pair? (car lst)) (list-of-pairs? (cdr lst)))  ; 当前元素是pair,检查剩余列表
    (else #f)))                         ; 存在非pair元素,返回#f

或者用if结构的等价版本:

(define (list-of-pairs? lst)
  (if (null? lst)
      #t
      (if (pair? (car lst))
          (list-of-pairs? (cdr lst))
          #f)))

逻辑说明

  1. 基线条件:当输入列表为空时,返回#t——因为没有元素需要检查,自然符合“所有元素都是pair”的要求。
  2. 递归条件:
    • 如果列表非空,先检查第一个元素是否为pair(所有cons构造的对象都是pair?的返回值为#t的对象)。
    • 如果第一个元素是pair,就递归检查剩余的子列表;如果不是,直接返回#f(只要有一个元素不符合,整个列表就不满足要求)。

三、测试案例验证

  • 空列表:(list-of-pairs? '()) → 返回#t
  • 全为pair的列表:(list-of-pairs? (list (cons 1 2) (cons 3 4))) → 返回#t
  • 包含非pair元素的列表:(list-of-pairs? (list (cons 1 2) 3)) → 返回#f
  • 你提供的调用案例:第三个元素是cons构造的对象,属于pair,所以调用后会返回#t

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 18:20:24