В простом сценарии для возврата минимума списка в схеме мое первое решение возвращает только первое значение списка. В чем ошибка? - PullRequest
4 голосов
/ 06 июня 2011
(define (minim lst)
  (COND
   ((NULL? (CDR lst)) (CAR lst))
   (< (CAR lst) (minim (CDR lst)) (CAR lst))
  (ELSE (minim (CDR lst))))
  )

(minim '(3 4 2 9 3 8)) 3

Я выяснил, что это вторая строка, которая оценивается и возвращает (АВТО любого списка).Чего мне не хватает?

1 Ответ

7 голосов
/ 06 июня 2011

Вам не хватает скобки во втором условии.Это заставляет оператор «<» работать не с двумя, а с тремя элементами.Правильный код выглядит следующим образом: </p>

(define (minim lst)
    (cond ((null? (cdr lst)) (car lst))
          ((< (car lst) (minim (cdr lst))) (car lst))
          (else (minim (cdr lst)))) )


(minim '(3 4 2 9 3 8)) 

Одно замечание: этот код не является хвостовой рекурсивной .Он проходит до конца списка и начинает сравнивать его (т. Е. Последний элемент сравнивается с предыдущим и т. Д.)текущий минимум, затем продолжайте обработку более короткого списка каждый раз.Если вы пойдете этим путем, вам понадобится дополнительный аргумент функции, содержащий текущий минимум (это эквивалентно левому сгибу, а не правому сгибу, который вы реализовали).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...