我在递归方面遇到了一些问题。只是想确保我变得更好。假设我想查看列表中是否有n个数字。如果是,则返回true,否则返回false。
(define (contains? n lst)
(cond
[(empty? lst) false]
[(cons? lst)
..... (first lst)
(contains? (rest lst)
递归部分总是欺骗我。是否有必要在此致电cons?
?因为如果您只是寻找列表的第一个,那就是isn.t
(define (contains? n lst)
(cond
[(empty? lst) false]
[(= n (first lst)) true]))
(check-expect (contains? 1 (list 1 2)) true)
(check-expect (contains? 1 empty) false)
答案 0 :(得分:2)
不,在数字列表(或通常:原子列表)的情况下,您不必使用cons?
:列表为空或非空。您只需使用cons?
来检查参数是否不是列表,但通常您不必验证它:如果它不是列表,则函数失败(应该如此)。
当你有一个列表列表时,会发生完全不同的事情:在这种情况下,我们必须使用cons?
(或等价:pair?
)来测试第一个元素是否是一个列表本身,并且也推进了它的递归。但是对于当前的例子,你做必须考虑的是这三种情况:
(define (contains? n lst)
(cond
[(empty? lst) false] ; the list is empty
[(= (first lst) n) true] ; current element is the one we're looking for
[else (contains? n (rest lst))])) ; current element is not the one, keep looking