Если заявление со сравнением - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь сделать сравнение, чтобы найти наибольшее число в списке. Я знаю, что могу просто использовать (max 1 2 4 3), но я пытаюсь написать функцию самостоятельно. Однако я не слишком уверен, где ошибка. Всякий раз, когда я запускаю это, максимум всегда равен 2. Я делаю сравнение где-то неправильно или что-то забываю?

(defn maxVal [list]
  (def maxValue 0)

  (doseq [x list]
    (println x maxValue)
    (if > x maxValue)
      (do (println x ">" maxValue)
          (def maxValue x)))
    (var-get #'maxValue))

(maxVal '(1 4 3 2))

1 Ответ

0 голосов
/ 16 сентября 2018

Проблема в том, что ваш код оценивает > как значение, а не вызывает его как функцию.

(if > x maxValue)

... оценивается как x, потому что функция > не является ни nil, ни ложной, и, следовательно, верна, когда оценивается как логическое значение - и x находится в положении "если верно", точно так же, как maxValue находится в позиции "else" в этом if. Следовательно, текущий отступ (хотя он точно отражает намерение ) немного вводит в заблуждение; do должен быть за пределами if, поскольку это происходит независимо от того, что произошло ранее.

Предположительно, вместо этого вы хотите:

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