如何编写自己的"列表?" 计划程序

sta*_*93m 3 scheme procedure list

我想写自己的'清单?' 计划中的谓词.我知道列表的定义:1.空列表2.对,其cdr是一对

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

(define (my-list? x)
  (if (equal? x ()) #t
      (pair? x)))
Run Code Online (Sandbox Code Playgroud)

Ósc*_*pez 5

该list?过程检查列表是否正确(嵌套的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
Run Code Online (Sandbox Code Playgroud)

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

(my-list? 42)
=> #f
(my-list? (cons 1 2))
=> #f
Run Code Online (Sandbox Code Playgroud)

并将返回true正确的列表:

(my-list? '())
=> #t
(my-list? (cons 1 (cons 2 '())))
=> #t
Run Code Online (Sandbox Code Playgroud)