Почему моя функция продолжает возвращать пустой список? - PullRequest
0 голосов
/ 26 июня 2019

Я пишу upper-threshold функцию в Racket, которая принимает два аргумента: список чисел и целое число.

Все, что нужно сделать, это рекурсивно пройти по списку и вернуть список целых чисел, которые находятся ниже значения данного целого числа.Тем не менее, моя функция всегда выплевывает пустой список.Я чувствую, что это как-то связано с тем, как я использую функцию добавления.

Я отобразил значения, которые должны быть добавлены в мой пустой список 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 голосов
/ 27 июня 2019

Третий аргумент, 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)])
...