0

我在递归方面遇到了一些问题。只是想确保我变得更好。假设我想查看一个数字是否在列表中。如果是,则返回 true,否则返回 false。

(define (contains? n lst)
  (cond
    [(empty? lst) false]
    [(cons? lst)
   .....  (first lst)
      (contains? (rest lst)

递归部分总是欺骗我。有必要在这里打电话cons?吗?因为如果你只是在寻找列表的第一个,它不是。

(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)
4

1 回答 1

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
于 2013-11-13T22:06:01.100 回答