计划中的一般递归

时间:2013-11-13 21:59:14

标签: recursion scheme racket

我在递归方面遇到了一些问题。只是想确保我变得更好。假设我想查看列表中是否有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)

1 个答案:

答案 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