Третий аргумент, z
, не включается ни в один из рекурсивных вызовов upper-threshold
.Это означает, что на каждой итерации z
всегда будет пустым списком.Более того, append
Racket не изменяет списки, над которыми он работает.Это означает, что выражение (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)])