Консультация № 189448
20.05.2016, 09:58
0.00 руб.
20.05.2016, 20:59
0 25 1
Язык Lisp.

1) Написать функцию возведения числа X в степень Y.

Код:
(defun power (x y)
(cond
((= y 0) 1)
(t
(* x (power x (- y 1)))
)
)
)


2) Вычислить значение функции y=10/(1+x), где x?[0..20] и изменяется с шагом h=0.5, все полученные значения хранить в списке.

Код:
(defun func (x)
(setq y (/ 10 (+ 1 x)))
(cond
((= x 20) (list x y))
(t
(cons (list x y) (func (+ x 0.5)))
)
)
)


>> loop for x in (func 4) do (print x)
3) Написать функцию удаления из списка элемента с указанным
номером.

Код:
(defun kill# (a b)
(cond
((= b 0) (cdr a))
((atom a) a)
(t
(cons (car a) (kill# (cdr a) (- b 1)))
)
)
)


4) Написать функцию удаления из списка первого встреченного
элемента, соответствующего указанному значению.


Код:
(defun killf (a key)
(cond
((atom a) a)
((= key (car a)) (cdr a))
(t
(cons (car a) (killf (cdr a) key))
)
)
)


Может кто-то объяснитЬ, что мы тут делаем в каждой строке?

Обсуждение

давно
Старший Модератор
31795
6196
20.05.2016, 11:57
общий
Адресаты:
Что именно Вам не понятно?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 12:03
общий
Написать функцию удаления из списка элемента с указанным
номером.
что именно делает:
((atom a) a) и (- b 1) и где тут именно удаление?
давно
Посетитель
399158
228
20.05.2016, 12:43
общий
[q=31795][/q] подскажите?
давно
Старший Модератор
31795
6196
20.05.2016, 12:46
общий
Функция kill# вызывает сама себя рекурсивно, каждый раз передавая себе только хвост списка и уменьшая счетчик.
Если смотреть на список, то с ним будет следующее:
q werty 3
w erty 2
e rty 1
r ty 0 <= рекурсия закочилась, возвращается только ty в строке ((= b 0) (cdr a))
дальше CONS соединяет
e ty
w ety
q wety

Както так.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
20.05.2016, 12:54
общий
Адресаты:
Цитата: Посетитель - 399158
подскажите?

Поняли?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 13:00
общий
Цитата: Зенченко Константин Николаевич
Поняли?

т.е. (t
(cons (car a) (kill# (cdr a) (- b 1)))
)
здесь t не обязательно, да?
давно
Посетитель
399158
228
20.05.2016, 13:01
общий
((atom a) a) что это?
давно
Старший Модератор
31795
6196
20.05.2016, 13:12
общий
Адресаты:
атом проверяет является ли А - атомом, т.е. базовой величиной, с которыми может работать LISP.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 13:15
общий
это понял, спасибо
давно
Посетитель
399158
228
20.05.2016, 13:17
общий
4) Написать функцию удаления из списка первого встреченного
элемента, соответствующего указанному значению.


(defun killf (a key)
(cond
((atom a) a)
((= key (car a)) (cdr a))
(t
(cons (car a) (killf (cdr a) key))
)
)
)
это работает по тому же принципу, что и третья функция?
давно
Старший Модератор
31795
6196
20.05.2016, 13:20
общий
Адресаты:
Да, только вместо ((= b 0) (cdr a)) проверяется значение головы ((= key (car a)) (cdr a))
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 13:23
общий

1) Написать функцию возведения числа X в степень Y.

(defun power (x y)
(cond
((= y 0) 1)
(t
(* x (power x (- y 1)))
)
)
)

почему тут это: ((= y 0) 1)?
давно
Старший Модератор
31795
6196
20.05.2016, 13:41
общий
Адресаты:
тоже рекурсия, если У=0 то возвращается 1
т.е.
х 4
- х 3
- - х 2
- - - х 1
- - - - х 0 тут рекурсия закончилась, возвращается 1
- - - 1*х
- - 1*х*х
- 1*х*х*х
1*х*х*х*х
как-то так.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 13:48
общий
не очень понял...(
давно
Старший Модератор
31795
6196
20.05.2016, 14:11
общий
Адресаты:
Есть такая строка:
Цитата: Посетитель - 399158
(* x (power x (- y 1)))

Мат. операции LISP может производить только переменными имеющими значения. Х имеет значение при вызове, power - нет, поэтому power будет сама себя вызывать, пока У больше нуля, а при нуле ((= y 0) 1) power вернет 1, после этого будет умножатся с Х, и так до тех пор, пока не выйдет с рекурсии.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 14:30
общий
Cond ...t ... что это?
давно
Старший Модератор
31795
6196
20.05.2016, 14:50
общий
Адресаты:
Код:
(defun kill# (a b) - определяем функцию
(cond - разветвляем вычисления
((= b 0) (cdr a)) - проверка достигла ли b нуля, да возвращаем хвост списка, нет переходим к следующему условию
((atom a) a) - проверка является ли а атомом, в даном случае nil, т.е. пустой ли список, иначе дальше
(t - проверка является ли строка ниже предикатом, т.е. не атомом
(cons (car a) (kill# (cdr a) (- b 1))) - соединяем голову списка и результат работы самой себя, но с другими входными данными
)
)
)

Как только последовательно сработает первая истина, COND завершит работу функции
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 14:55
общий
В первой примере тоже? Сond ..t такой же?
давно
Старший Модератор
31795
6196
20.05.2016, 15:02
общий
Адресаты:
Вы другие языки программирования знаете?
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 15:03
общий
Да
давно
Старший Модератор
31795
6196
20.05.2016, 15:13
общий
Адресаты:
Код:
(defun power (x y) == FUNCTION power(x,y)
(cond == IF
((= y 0) 1) == Y=0 then power=1
(t == ELSE
(* x (power x (- y 1))) == power:=x*power(x,y-1)
)
)
)
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 15:36
общий
Во 2 задании, какое первое значение выведет?
давно
Старший Модератор
31795
6196
20.05.2016, 16:54
общий
Адресаты:
x=4, x=4.5 . . . x=20
Я так думаю, лиспа у меня нет.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
20.05.2016, 19:05
общий
спасибо! Все объяснили
давно
Старший Модератор
31795
6196
23.05.2016, 12:35
общий
это ответ
Здравствуйте, Посетитель - 399158!

Опишем используемые функции:
[table][row][col]DEFUN[/col][col]определяет функцию пользователя[/col][/row][row][col]ATOM[/col][col]предикат возвращает истину, если переменная является атомом[/col][/row]
[row][col]CAR[/col][col]функция возвращает голову списка[/col][/row]
[row][col]CDR[/col][col]функция возвращает хвост списка[/col][/row]
[row][col]CONS[/col][col]функция присоединяет голову к хвосту списка[/col][/row]
[row][col]COND[/col][col]функция ветвления возвращает результат, если сработает соответсвующее условие[/col][/row]
[row][col]T[/col][col]последняя строка функции ветвления, срабатывает, если не сработало ни одно условие верления[/col][/row]
[row][col]=[/col][col]функция сравнивает переменную с прерменной или значением[/col][/row]
[row][col]+ - * /[/col][col]математичиские функции сложения, вычитания, умножения и деления[/col][/row][/table]

Код:
(defun power (x y) = определяем функцию пользователя
(cond = ветвление вычислительного процесса
((= y 0) 1) = проверяем равна ли переменная Y нулю, т.е. если степень равна нулю возвращается 1
(t = выполнить следующую строку в любом случае
(* x (power x (- y 1))) = рекурсивно вызываем функцию с измененной степенью и полученный результат умножаем с переменной
)
)
)


Код:
(defun func (x)
(setq y (/ 10 (+ 1 x))) = вычисляем текущее значение переменной
(cond
((= x 20) (list x y)) = возвращаем список из переменной и значения
(t
(cons (list x y) (func (+ x 0.5))) = соединяем ренее полученный список с текущим
)
)
)


Код:
(defun kill# (a b)
(cond
((= b 0) (cdr a)) = если переменная В равна нулю возвращается хвост списка
((atom a) a) = проверяется является ли А атомом, т.е. пустой ли список
(t
(cons (car a) (kill# (cdr a) (- b 1))) = востанавливаем список, без уже вычеркнутого элемента
)
)
)


Код:
(defun killf (a key)
(cond
((atom a) a)
((= key (car a)) (cdr a)) = проверяется, является ли голова списка нужным элементом
(t
(cons (car a) (killf (cdr a) key))
)
)
)


Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа