如何编写自己的“清单”?计划中的程序

时间:2019-02-02 12:46:48

标签: list scheme procedure

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

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

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

1 个答案:

答案 0 :(得分:5)

list?过程检查列表是否为proper(嵌套的cons单元格以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