为什么我的函数不断返回空列表?

时间:2019-06-26 20:51:47

标签: racket

我正在用Racket编写一个upper-threshold函数,该函数带有两个参数:数字列表和整数。

它所要做的就是递归地遍历该列表,并返回一个小于给定整数值的整数列表。但是,我的函数总是吐出一个空列表。我觉得这与我使用append函数的方式有关。

我已经显示了应该附加到我的空列表z中的值,并且它们是正确的,但是由于某些原因它们没有附加到列表中!

(define (upper-threshold x y [z '()])
  (cond [(null? x) z]
    [else (cond [(< (first x) y) (append (list (first x)) z) (upper-threshold (rest x) y)]
          [else (upper-threshold (rest x) y)])]))

例如,回电应如下所示:

(upper-threshold '(1 2 3 5 6) 4) '(1 2 3)

1 个答案:

答案 0 :(得分:0)

z的任何递归调用中都没有包含第三个参数upper-threshold。这意味着在每次迭代中,z将始终为空列表。此外,Racket的append不会更改其操作的列表。这意味着表达式(append (list (first x)) z)会产生一个全新的列表,而不是更改xz

(cond [(< (first x) y)
       (append (list (first x)) z) ; produces a new list which is not used, x and z
                                   ; remain unchanged
       (upper-threshold (rest x) y ; no z argument passed in here, defaults to '()
       )]
      [else
       (upper-threshold (rest x) y ; no z argument passed in here, defaults to '()
       )])

我们要做的就是为每个递归调用提供正确的第三个参数。

(cond [(< (first x) y)
       (define new-z (append (list (first x)) z))
       (upper-threshold (rest x) y new-z)]
      [else
       (upper-threshold (rest x) y z)])

此外:每当您想将元素添加到列表的开头时,使用函数cons而不是append会更容易。因此,(append (list (first x)) z)成为(cons (first x) z)

(cond [(< (first x) y)
       (define new-z (cons (first x) z))
       (upper-threshold (rest x) y new-z)]
      [else
       (upper-threshold (rest x) y z)])