我正在用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)
答案 0 :(得分:0)
对z
的任何递归调用中都没有包含第三个参数upper-threshold
。这意味着在每次迭代中,z
将始终为空列表。此外,Racket的append
不会更改其操作的列表。这意味着表达式(append (list (first x)) z)
会产生一个全新的列表,而不是更改x
或z
。
(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)])