Напишите треугольник функции lisp, который принимает нечетное число в качестве аргумента (n) и показывает треугольник напечатанных нечетных чисел - PullRequest
0 голосов
/ 24 октября 2019

Программирование на Лиспе Вам понадобится создать код, который будет проходить через целое число и создавать треугольник с предоставленным целым числом. Снова возникает вопрос: «Напишите треугольник функции lisp, который принимает нечетное число в качестве аргумента (n) и показывает треугольник напечатанных нечетных чисел, как показано в следующих примерах. Если входные данные являются четными, десятичными или строковыми, следует вывестисоответствующее сообщение ". Он должен показать ошибку для десятичных чисел (что я и сделал), а также для четного числа, но не настолько точно вычислить это в моем коде.

Этот код работает и создает треугольник, но не только для нечетных чисел. Пример: 1

1 3

1 3 5

1 3 5 7

1 3 5 7 9

вывод моего кода(треугольник 3):

1

12

123

(defun triangle (n)
    (if (typep n'integer)
        (loop for i from 1 to n
              do (loop for j from 1 to i
                       do (write j)
                       )
              (write-line "")
        )
    (write-line "Decimal numbers are not valid input, Please enter an integer"))
    )
(triangle 3)

i, за исключением того, что out имеет только нечетные числа и выдает ошибку для десятичного числаи четные числа.

1 Ответ

3 голосов
/ 24 октября 2019

Подсказки:

  • есть ли предикат, который сообщает вам, является ли число нечетным (посмотрите подсказку в приведенном ниже коде)?
  • вы можете понять, какзаставить loop считать через интервалы, отличные от 1, потому что если вы можете сосчитать по 2, то вы можете перечислить нечетные числа.

Но иногда я просто не могу удержаться от ответа, который вы не можете(и не должны) отправлять:

(defun triangle (n)
  (assert (typep n '(and (integer 1)
                         (satisfies oddp)))
      (n) "~S is not a positive odd integer" n)
  ((lambda (c) (funcall c c n))
   (lambda (c m)
     (when (> m 1)
       (funcall c c (- m 2)))
     (format t "~{~D~^ ~}~%"
             ((lambda (c) (funcall c c m '()))
              (lambda (c i a)
                (if (< i 1)
                    a
                  (funcall c c (- i 2) (cons i a))))))
     m)))
...