Вопрос:

Проверка четных и нечетных значений в цикле с помощью Lisp

lisp common-lisp clisp

44 просмотра

2 ответа

905 Репутация автора

Я не понимаю, почему следующая программа lisp отображает 15 строк вывода, а не 10:

(defparameter x 1)
(dotimes (x 10)
  (if (oddp x)
    (format t "x is odd~%"))
    (format t "x is even~%"))

Я использую CLISP 2.49 на компьютере с Windows 10.

Автор: CaitlinG Источник Размещён: 12.06.2019 06:38

Ответы (2)


5 плюса

188 Репутация автора

Решение

Текущий:

(if (oddp x)
    (format t "x is odd~%"))    ; <- extra parenthesis
    (format t "x is even~%"))

В розыске:

(if (oddp x)
    (format t "x is odd~%")
    (format t "x is even~%"))

Вы экранируете форму if перед оператором else, чтобы оператор else всегда печатался, а оператор if печатался 5 раз.

Автор: assoron Размещён: 12.06.2019 06:54

5 плюса

23741 Репутация автора

В дополнение к принятому ответу, обратите внимание, что с помощью редактора с автоматическим отступом (например, в Emacs) можно легко обнаружить такие ошибки. Ваш код авто-отступов выглядит следующим образом:

(dotimes (x 10)
  (if (oddp x)
      (format t "x is odd~%"))
  (format t "x is even~%"))

Эти ifи вторые formatвыражения выровнены по вертикали (они являются братьями и сестрами в дереве с корнем dotimes) , тогда как вы хотите, чтобы второе formatпроизойдет только тогда , когда тест не пройден, на той же глубине, что и первый.

замечание

Вы также можете выделить некоторый код:

(format t 
        (if (oddp x) 
          "x is odd~%" 
          "x is even~%"))

Или даже:

(format t
        "x is ~:[even~;odd~]~%" 
        (oddp x))

Вышеуказанное зависит от условного форматирования .

Автор: coredump Размещён: 12.06.2019 08:52
32x32