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

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

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

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

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

textual
Листинг программы
  1. (defun make-seq (x)
  2.  (let ((c x)
  3.        (p 0)
  4.        (n 0)
  5.        (z 0))
  6.       (lambda nil
  7.         (cond ((zerop n) (setq n (+ 1 n)) p)
  8.               ((= n 1)   (setq n (+ 1 n)) c)
  9.               (t (setq z (+ (* 1/5 (^ c 2)) (* 1/2 (* x x) p))
  10.                        p c
  11.                        c z
  12.                        n (+ 1 n)) z )))))
  13.  
  14. ==> make-seq
  15. (setq seq-1 (make-seq 1))
  16.  
  17. ==> (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)))
  18. ;; Создана глобальная переменная seq-1
  19. (loop
  20.   (printline (funcall seq-1)))
  21.  
  22. 0
  23. 1
  24. 1/5
  25. 127/250
  26. 47379/312500
  27. 126268207141/488281250000
  28. 106311931008625920893881/1192092895507812500000000
  29. 930024349851631819143312135322541055290063242161/7105427357601001858711242675781250000000000000000
  30.  
  31. ==> 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы