0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 7
1

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

14.11.2015, 17:35. Показов 1256. Ответов 9
Метки нет (Все метки)

У меня возникли затруднения с реализацией последовательности (бесконечной) на лиспе. Возможно, задание не особо трудное, но мне не хватает знаний по этому языку. Помогите описать следующую последовательность (но без использования циклов, только с помощью рекурсии, хвостовой или нехвостовой):
Для заданного x определить последовательность an+1 = 1/5 * (an)^2 + x^2/2 * (an-1), a0 = 0, a1 = x.
P.S. Но последовательность не должна определяться в виде поэлементного конструктора с помощью функции независимого вычисления элемента.
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.11.2015, 17:35
Ответы с готовыми решениями:

Функциональное программирование на языке Lisp
Добрый вечер, всем форумчанин! Тема №1: Определение простых рекурсивных функций обработки...

Записать на языке Common Lisp
Помогите пожалуйста с ещё одной задачей: Записать на языке Common Lisp форму для вычисления y(x) ...

Курсовая работа на языке Lisp
Помогите пожалуйста выполнить курсовую работу на тему: Разработка параметрической модели на языке...

Работа с двоичными деревьями в языке lisp
создал некое дерево в языке lisp: (setq list ' (4 (2 (1 nil nil) (3 nil nil)) (5 nil nil))) нужно...

9
Модератор
Эксперт функциональных языков программированияЭксперт Python
29988 / 16465 / 3334
Регистрация: 12.02.2012
Сообщений: 27,396
Записей в блоге: 5
14.11.2015, 22:05 2
Цитата Сообщение от Elena_KK Посмотреть сообщение
Но последовательность не должна определяться в виде поэлементного конструктора с помощью функции независимого вычисления элемента.
- сильно сказано... Я ничего не понял!

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
(defun a (x n)
  (cond ((zerop n) 0)
        ((= n 1)   x)
        (t (+ (* 1/5 (^ (a x (- n 1)) 2)) (* 1/2 (* x x) (a x (- n 2)))))))  
 
==> a
 
(a 3 5)
 
==> 257337216203661/488281250000
 
(a 1 2)
 
==> 1/5
 
(a 2 3)
 
==> 516/125
0
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 7
14.11.2015, 23:01  [ТС] 3
Спасибо, но здесь вычисляется просто отдельный элемент при конкретном n, а мне нужно получить бесконечную последовательность, зависящую только от x
0
555 / 791 / 137
Регистрация: 10.08.2015
Сообщений: 3,845
15.11.2015, 00:01 4
Как-то так...
Lisp
1
2
3
4
5
6
7
8
9
(defun task (x n &optional (acc nil)
                              (a 0)
                              (b x)
                              (i 1)
                 &aux (c (+ (* 0.2 b b ) (* 0.5 x x a))))
  (cond
    ((zerop n) '(0))
    ((= i n) (append (list 0 x) (reverse acc)))
    (T (task x n (cons c acc) b c (1+ i)))))
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
29988 / 16465 / 3334
Регистрация: 12.02.2012
Сообщений: 27,396
Записей в блоге: 5
15.11.2015, 10:23 5
Бесконечную последовательность в Лиспе можно смоделировать с помощью замыкания:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
(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
 
;; Создаем последовательность с x=1
 
(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)))
 
(funcall seq-1)
 
==> 0
 
(funcall seq-1)
 
==> 1
 
(funcall seq-1)
 
==> 1/5
 
(funcall seq-1)
 
==> 127/250
 
(funcall seq-1)
 
==> 47379/312500
 
(funcall seq-1)
 
==> 126268207141/488281250000
 
(funcall seq-1)
 
==> 106311931008625920893881/1192092895507812500000000
 
;; и т.д.
 
;; Создаем последовательность с x=2
 
(setq seq-2 (make-seq 2))
 
==> (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 2) (x 2)))
 
(funcall seq-2)
 
==> 0
 
(funcall seq-2)
 
==> 2
 
(funcall seq-2)
 
==> 4/5
 
(funcall seq-2)
 
==> 516/125
 
;; и т.д.
1
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 7
18.11.2015, 23:04  [ТС] 6
Немного непреивычно, что последовательность передается в качестве аргумента, а вот функции &optional и &aux мне неизвестны (И все же, это последовательность выводит первые n элементов, она конечная, а мне нужно выводить бесконечную (ну конечно без tail и head не обойтись при распечатывании, иначе зависнет компилятор), и при вызове указать только значение x.

Добавлено через 2 минуты
Немножко непонятно, почему cond от 3 аргументов, как я помню там только (условие) (результат) (это к последнему ответу)
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
29988 / 16465 / 3334
Регистрация: 12.02.2012
Сообщений: 27,396
Записей в блоге: 5
19.11.2015, 09:24 7
Лучший ответ Сообщение было отмечено Elena_KK как решение

Решение

Elena_KK, &optional и &aux - это не функции, а специальные маркеры, показывающие начало областей необязательных и вспомогательных параметров функции соответственно.

Последовательность ничего не "выводит". Обращайтесь к замыканию в бесконечном цикле - получите бесконечную последовательность:

Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
(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 ;; Прервал вычисления
Цитата Сообщение от Elena_KK Посмотреть сообщение
Немножко непонятно, почему cond от 3 аргументов, как я помню там только (условие) (результат)
- неправильно помните... Cond может содержать любое число "аргументов" (групп условий).
1
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 7
19.11.2015, 22:02  [ТС] 8
Интерпретаторы разные наверное, у меня такая последовательность не компилируется, ну точнее ошибки выдает
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
29988 / 16465 / 3334
Регистрация: 12.02.2012
Сообщений: 27,396
Записей в блоге: 5
20.11.2015, 11:14 9
Цитата Сообщение от Elena_KK Посмотреть сообщение
ошибки выдает
- какие?
0
0 / 0 / 0
Регистрация: 14.11.2015
Сообщений: 7
20.11.2015, 16:07  [ТС] 10
А, все, я разобралась, там просто запись немного другая, степень по другому, все, я поняла, спасибо большое!
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.11.2015, 16:07

Создание простейшего автомата на языке Lisp
Доброго времени суток! Коллеги, нужна ваша помощь. Лисп для меня язык новый и непривычный, а на...

Сложить по 3 все элементы числового списка на языке LISP
Как на языке LISP сделать реккурсивную функцию для работы со списками: Сложить по 3 все элементы...

Записать определение функции F1 на языке программирования Common Lisp
Помогите с сессией! Записать определение функции F1 на языке программирования Common Lisp, которая...

Зачем в языке LISP нужно использовать функцию reverse (на конкретном примере)
Добрый день. Рассмотрим такую функцию: (defun findLst (lst lstToFind index path) (cond ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.