【问题标题】:How to write your own "list?" procedure in Scheme如何编写自己的“清单”? Scheme中的程序
【发布时间】:2019-02-02 12:46:47
【问题描述】:

我正在尝试编写自己的“列表?”方案中的谓词。我知道列表的定义:1. 空列表 2. 对,其 cdr 是一对

我知道我的代码是错误的,因为它在每一对上都返回真值,但每一对都不是一个列表。我不知道如何实现列表的 cdr 必须也是一对的条件。

(define (my-list? x)
  (if (equal? x ()) #t
      (pair? x)))

【问题讨论】:

  • "2.pair,其 cdr 是一对"是错误的。我应该是“2. paor,其 cdr 是 list?”您的示例没有检查 cdr,因此当参数是一对时您需要这样做。

标签: list scheme procedure


【解决方案1】:

list? 过程检查列表是否为 proper(嵌套的 cons-cells 以 null 值结尾),因此我们必须考虑三种情况:

(define (my-list? x)
  (cond ((null? x) #t)                 ; empty list
        ((pair? x) (my-list? (cdr x))) ; pair, advance recursion
        (else #f)))                    ; atom

null 值被视为空列表。如果我们是一对,那么我们通过递归调用过程来推进它的cdr。如果它不是null 也不是一对,它就是一个原子。这将涵盖边缘情况,例如:

(my-list? 42)
=> #f
(my-list? (cons 1 2))
=> #f

并且将返回 true 以获得正确的列表:

(my-list? '())
=> #t
(my-list? (cons 1 (cons 2 '())))
=> #t

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-16
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多