> 1 <

Автор Сообщение

Аня Аня

Members


Статус

12 сообщений

Где: Russia
Род занятий:
Возраст:

#3452   2010-11-18 03:11 GMT+3 часа(ов)      
Описать функцию, которая бы находила сумму всех числовых элементов в списке. Список может содержать подсписки произвольной глубины.

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3453   2010-11-18 03:20 GMT+3 часа(ов)      
Тебе алгоритм рассказать? Сама не догоняешь?

Аня Аня

Members


Статус

12 сообщений

Где: Russia
Род занятий:
Возраст:

#3455   2010-11-18 03:31 GMT+3 часа(ов)      
Предположим, есть функция, возвращающая сумму элементов числового списка. Пусть имя этой функции - SUMLIST. Тогда вызов (SUMLIST (1 2 3 4 5)) должен вернуть атом 15. Однако, в соответствии с написанным выше, Лисп сделает попытку вычислить значение списка (1 2 3 4 5), что, в свою очередь, повлечет за собой попытку вычисления значения функции 1 со списком аргументов (2 3 4 5). Это, естественно, вызовет ошибку.
и что делать??

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3456   2010-11-18 03:39 GMT+3 часа(ов)      
Правильно, ошибка будет. Для этого придуман '.
'(1 2 3 4 5) вычислится в (1 2 3 4 5).

Аня Аня

Members


Статус

12 сообщений

Где: Russia
Род занятий:
Возраст:

#3460   2010-11-18 03:52 GMT+3 часа(ов)      
так, я чт ото туплю окончательно. у меня не получается (sumlist '(1 2 3 4 5))
он выдает ошибку

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3461   2010-11-18 03:57 GMT+3 часа(ов)      
Покажи исходник, как ты определяешь функцию sumlist?

Аня Аня

Members


Статус

12 сообщений

Где: Russia
Род занятий:
Возраст:

#3462   2010-11-18 04:00 GMT+3 часа(ов)      
(Defun SUMLIST (1 2 3 4 5)
(+ 1 2 3 4 5))

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3463   2010-11-18 04:06 GMT+3 часа(ов)      
неа, так нельзя. Вот как определяется функция:
(defun f (a1 ... an) <тело_функции>) - объявление функции f c аргументами a1 ... an.
Где все ai - символы.
В твоем случае n равно единице, т.е. у тебя только один аргумент - список.
(defun sumlist (lst) ...)

Аня Аня

Members


Статус

12 сообщений

Где: Russia
Род занятий:
Возраст:

#3467   2010-11-18 04:25 GMT+3 часа(ов)      
т.е. сначала мы вводим функцию, а потом применяем ее к данному списку.
он выдал в ответе сумму.)

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3468   2010-11-18 04:28 GMT+3 часа(ов)      
Цитата
т.е. сначала мы вводим функцию, а потом применяем ее к данному списку.

ДА.
Теперь, тебе нужно написать такую функцию, которая бы вычисляла сумму чисел например в таком списке:
(1 2 3 (4 5) 6)

Аня Аня

Members


Статус

12 сообщений

Где: Russia
Род занятий:
Возраст:

#3472   2010-11-18 04:46 GMT+3 часа(ов)      
Функция SUMLIST верно работает только для атомных одноуровневых списков.
Если попытаться вызвать эту функцию для списков другого типа, то она окажется неработоспособной:

(sumlist '( 1 2 3 (4 5) 6))

Один из аргументов не атом.

(DEFUN SUMLIST (x)
(COND ((NULL x) 0)
((ATOM x) x)
(T (+ (SUMLIST (CAR x))(CAR x) (SUMLIST (CDR x))))))

Аня Аня

Members


Статус

12 сообщений

Где: Russia
Род занятий:
Возраст:

#3477   2010-11-18 05:04 GMT+3 часа(ов)      
да, все работают, спасибо.
в этом учебнике по-другому, но твое объяснение гораздо проще.
http://homelisp.ru/help/lisp.html
буду оставшиеся задания делать.

Аня Аня

Members


Статус

12 сообщений

Где: Russia
Род занятий:
Возраст:

#3483   2010-11-18 05:39 GMT+3 часа(ов)      
а почему не работает, надо объединить 2 списка, что бы эл-ты чередовались.
вот вводим функцию mix:
(defun MIX (L1 L2);
(cond ((null L1) L2)
(T (cons (car L1) (MIX L2 (cdr L1))))))

теперь применяем ф-ию к спискам
(mix (1 2 3) (a b c))

и он выдает ошибку

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3484   2010-11-18 05:45 GMT+3 часа(ов)      
У тебя все верно, просто ты забыла про '.

отредактировал(а) joba: 2010-11-18 06:53 GMT+3 часа(ов)

joba

Members


Статус

157 сообщений

Где: ---
Род занятий:
Возраст:

#3489   2010-11-18 06:53 GMT+3 часа(ов)      
Цитата
(DEFUN SUMLIST (x)
(COND ((NULL x) 0)
((ATOM x) x)
(T (+ (SUMLIST (CAR x))(CAR x) (SUMLIST (CDR x))))))

Тут у тебя все будет правильно, если убрать второй (CAR x).

ander-skirnir

Members


Статус

227 сообщений
http://lisper.ru
Где: Ukraine
Род занятий: `'`,`',`',
Возраст: 30

#3490   2010-11-18 07:00 GMT+3 часа(ов)      
(defun sumlist (list)
(iter (for x :in list)
(sum (if (atom x) x
(sumlist x)))))

Аня Аня

Members


Статус

12 сообщений

Где: Russia
Род занятий:
Возраст:

#3499   2010-11-18 15:16 GMT+3 часа(ов)      
Цитата
ander-skirnir :
(defun sumlist (list)
(iter (for x :in list)
(sum (if (atom x) x
(sumlist x)))))



Для описания какой функции?
> 1 <


Онлайн :

0 пользователь(ей), 36 гость(ей) :