如何在 Scheme 中编写自己的 "list?" 过程
How to write your own "list?" procedure in Scheme
我正在尝试在方案中编写自己的 'list?' 谓词。我知道列表的定义: 1. 空列表 2. pair,其 cdr 是一对
我知道我的代码是错误的,因为它在每一对上都返回真值,但每一对都不是列表。我不知道如何实现列表的 cdr 也必须是一对的条件。
(define (my-list? x)
(if (equal? x ()) #t
(pair? x)))
list?
procedure checks if a list is 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
并将 return true
用于适当的列表:
(my-list? '())
=> #t
(my-list? (cons 1 (cons 2 '())))
=> #t
我正在尝试在方案中编写自己的 'list?' 谓词。我知道列表的定义: 1. 空列表 2. pair,其 cdr 是一对
我知道我的代码是错误的,因为它在每一对上都返回真值,但每一对都不是列表。我不知道如何实现列表的 cdr 也必须是一对的条件。
(define (my-list? x)
(if (equal? x ()) #t
(pair? x)))
list?
procedure checks if a list is 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
并将 return true
用于适当的列表:
(my-list? '())
=> #t
(my-list? (cons 1 (cons 2 '())))
=> #t