Описать последовательность на языке Lisp

Узнай цену своей работы

Формулировка задачи:

У меня возникли затруднения с реализацией последовательности (бесконечной) на лиспе. Возможно, задание не особо трудное, но мне не хватает знаний по этому языку. Помогите описать следующую последовательность (но без использования циклов, только с помощью рекурсии, хвостовой или нехвостовой): Для заданного x определить последовательность an+1 = 1/5 * (an)^2 + x^2/2 * (an-1), a0 = 0, a1 = x. P.S. Но последовательность не должна определяться в виде поэлементного конструктора с помощью функции независимого вычисления элемента.

Решение задачи: «Описать последовательность на языке Lisp»

textual
Листинг программы
(defun make-seq (x)
 (let ((c x)
       (p 0)
       (n 0)
       (z 0))
      (lambda nil
        (cond ((zerop n) (setq n (+ 1 n)) p)
              ((= n 1)   (setq n (+ 1 n)) c)
              (t (setq z (+ (* 1/5 (^ c 2)) (* 1/2 (* x x) p))
                       p c
                       c z
                       n (+ 1 n)) z ))))) 
 
==> make-seq
(setq seq-1 (make-seq 1))
 
==> (CLOSURE NIL ((COND ((ZEROP n) (SETQ n (+ 1 n)) p) ((= n 1) (SETQ n (+ 1 n)) c) (T (SETQ z (+ (* 1/5 (^ c 2)) (* 1/2 (* x x) p)) p c c z n (+ 1 n)) z))) ((z 0) (n 0) (p 0) (c 1) (x 1)))
;; Создана глобальная переменная seq-1
(loop
  (printline (funcall seq-1)))
 
0
1
1/5
127/250
47379/312500
126268207141/488281250000
106311931008625920893881/1192092895507812500000000
930024349851631819143312135322541055290063242161/7105427357601001858711242675781250000000000000000
 
==> BRKSTATE ;; Прервал вычисления

Объяснение кода листинга программы

Код, представленный пользователем, является функцией make-seq, которая принимает один аргумент, обозначенный как x. Внутри функции создаются четыре переменные: c, p, n и z, которые инициализируются нулями. Затем функция создает анонимную функцию (lambda-функцию), которая возвращает последовательность чисел. Эта последовательность определяется с помощью условного выражения (cond), которое проверяет значение переменной n. Если n равно нулю, то значение переменной n увеличивается на единицу и присваивается переменной p. Если n равно единице, то значение переменной n увеличивается на единицу и присваивается переменной c. В противном случае, когда n больше единицы, выполняется следующий блок кода, который вычисляет значение переменной z на основе формулы, которая включает в себя значения переменных c, x и p. Значения переменных c, z и n обновляются в этом блоке кода. Функция make-seq возвращает созданную анонимную функцию, которая затем вызывается с аргументом x, создавая последовательность чисел. В приведенном примере кода вызывается функция make-seq с аргументом 1, что создает последовательность чисел от 0 до 1. Затем эта последовательность выводится на экран с помощью цикла loop и функции printline. Однако, поскольку код был прерван командой BRKSTATE, мы не видим полной последовательности чисел.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

9   голосов , оценка 3.889 из 5
Похожие ответы