我正在尝试写自己的“列表”?方案中的谓词。我知道列表的定义:1.清空列表2.对,其cdr为对
我知道我的代码是错误的,因为它在每一对上都返回真实值,但是每一对都不是一个列表。我不知道如何实现列表的cdr必须也是一对的条件。
(define (my-list? x)
(if (equal? x ()) #t
(pair? x)))
答案 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