Следующая страница > 1 < [2]

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

deadlegolas

Members


Статус

18 сообщений

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

#4015   2011-03-18 22:56 GMT+3 часа(ов)      
Добрый вечер
Вот начали изучать лисп в университете, в лабораторной есть задание:
"подсчитать количество атомов в списке"
я вот написал функцию с рекурсией и все отлично, но суть в том, что преподаватель требует реализовать эту задачу без рекурсии и я вот, чесно говоря, в ступоре)
буду рад помощи
спасибо

megamanx

Members


Статус

307 сообщений

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

#4016   2011-03-18 23:56 GMT+3 часа(ов)      
(defun foo (L)
(loop for i in L sum 1))
I wish I'd made you angry earlier

LinkFly

Members


Статус

152 сообщений

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

#4017   2011-03-19 00:14 GMT+3 часа(ов)      
О-о! Это что-то новенькое. Обычно здесь только и слышно "кар-кар-cdr" и "рекурсия"
Вот скоро выйдет книжка на русском ANSI Common Lisp, глядишь в вузах начнут вменяемо Лисп преподавать Пока, кстати, можно обойтись этим: http://lisper.ru/pcl/

deadlegolas

Members


Статус

18 сообщений

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

#4018   2011-03-19 00:21 GMT+3 часа(ов)      
megamanx
(defun foo (L)

(loop for i in L sum 1))



хм, странно, xlisp интерпретатор зависает

LinkFly

Members


Статус

152 сообщений

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

#4019   2011-03-19 00:23 GMT+3 часа(ов)      
выбрось xlisp. Возьми sbcl или Lispworks или ... до фига чего, только не xlisp ;)

LinkFly

Members


Статус

152 сообщений

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

#4020   2011-03-19 00:23 GMT+3 часа(ов)      
только не sum 1, а sum L

deadlegolas

Members


Статус

18 сообщений

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

#4021   2011-03-19 00:32 GMT+3 часа(ов)      
хах) ну просто преподаватель требует икслисп, как я понимаю в нем нету "for x in L"?

megamanx

Members


Статус

307 сообщений

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

#4022   2011-03-19 00:51 GMT+3 часа(ов)      
wtf? sum L
(defun foo (L)
(loop for i in L sum 1))
(defun foo2 (L)
(loop for i in L count i))
(defun foo3 (L)
(do ((i 0 (1+ i)))
((null (nthcdr i L)) i)())
I wish I'd made you angry earlier

deadlegolas

Members


Статус

18 сообщений

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

#4024   2011-03-19 01:18 GMT+3 часа(ов)      
спасибо) но опять трабл

error: unbound function - l+

третий вариант мне отлично подходит, но (l+ i) не выполняет

megamanx

Members


Статус

307 сообщений

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

#4025   2011-03-19 01:33 GMT+3 часа(ов)      
(1+ x) === (+ x 1)
I wish I'd made you angry earlier

deadlegolas

Members


Статус

18 сообщений

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

#4026   2011-03-19 01:41 GMT+3 часа(ов)      
а, я думал, что то L нижнего регистра, ступил.
но проблема в том, что оно считает только количество елементов списка, а не атомов. например,
(foo3 '(1 (2 3 4) 3))
выдаст 3, хотя атомов то 5? разве я не прав?

megamanx

Members


Статус

307 сообщений

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

#4027   2011-03-19 01:43 GMT+3 часа(ов)      
ну это уже проход по подспискам, с этим надо подольше подумать, не всё сразу
I wish I'd made you angry earlier

deadlegolas

Members


Статус

18 сообщений

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

#4028   2011-03-19 01:48 GMT+3 часа(ов)      
ну кстати спасибо за эту версию подсчета елементов, а то у меня такая процедура заняла кучу кода, возьму на заметку)

deadlegolas

Members


Статус

18 сообщений

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

#4029   2011-03-19 02:20 GMT+3 часа(ов)      
ну вот моя функция с рекурсией, которая раскрывает подсписки и считает к-тво атомов:
(defun f_atoms (x)
(if x
(+
(if (atom (car x)) 1
(f_atoms (car x)))
(f_atoms (cdr x)))
0))
 


но вот хз как без рекурсии это сделать.

megamanx

Members


Статус

307 сообщений

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

#4030   2011-03-19 02:22 GMT+3 часа(ов)      
(defun  test1 (L)
(let ((retval nil))
(do
((i 0 (1+ i)))
((null (nthcdr i L)) retval)
((lambda (z) (if (atom z)
(incf summ)
(setf retval (append z retval))))
(nth i L)))))
 
 
(defun maintest (Li)
(let ((L Li) (Summ 0))
(do
()
((null L) summ)
(setf L (test1 L)))))


это всё можно посократить, покрасивше сделать, но смысл такой - после прохода списка создём новый список из подсписков. Пока он не будет пустой, проделываем эту операцию.
(a s (d (f) g) h) -> summ = 3 (d (f) h) -> summ = 5 (f) -> summ=6 nil

отредактировал(а) megamanx: 2011-03-19 02:30 GMT+3 часа(ов)
I wish I'd made you angry earlier

megamanx

Members


Статус

307 сообщений

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

#4031   2011-03-19 02:28 GMT+3 часа(ов)      
как-то так
(defun solver (Li)	
(labels ((test1 (L)
(let ((retval nil))
(do
((i 0 (1+ i)))
((null (nthcdr i L)) retval)
((lambda (z) (if (atom z)
(incf summ)
(setf retval (append z retval))))
(nth i L))))))
(let ((L Li) (Summ 0))
(do ()
((null L) summ)
(setf L (test1 L))))))
I wish I'd made you angry earlier

deadlegolas

Members


Статус

18 сообщений

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

#4032   2011-03-19 02:40 GMT+3 часа(ов)      
incf я так понял, что просто (setf x (+ x 1). а что за summ?

megamanx

Members


Статус

307 сообщений

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

#4033   2011-03-19 02:45 GMT+3 часа(ов)      
в первом варианте надо ещё перед этим переменную Summ создать и обнулить её, во втором случае она замкнута в функции
I wish I'd made you angry earlier

deadlegolas

Members


Статус

18 сообщений

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

#4034   2011-03-19 02:49 GMT+3 часа(ов)      
ага, спасибо. но вот результат обоих вариантов при любых списках - 0

megamanx

Members


Статус

307 сообщений

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

#4035   2011-03-19 02:52 GMT+3 часа(ов)      
ну это косяк xlisp, я, разумеется, проверил на sbcl. Вот тебе и домашка. Попробуй все замкнутые переменные убрать и сделать их глобальными.
I wish I'd made you angry earlier

deadlegolas

Members


Статус

18 сообщений

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

#4036   2011-03-19 02:53 GMT+3 часа(ов)      
(let ((L Li) (Summ х))
вот это значение "х" никак не изменяется в процессе

megamanx

Members


Статус

307 сообщений

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

#4037   2011-03-19 02:58 GMT+3 часа(ов)      
скачал специально xlisp, всё заработало.
то есть, оно не изменяется? Наблюдай внимательно за областью видимости - при определении переменной в функции она хавается в первую очередь, глобальная - в последнюю. То есть тебе даже определять глобальную переменную не надо, я просто не на тот вариант посмотрел





сцылка
I wish I'd made you angry earlier

deadlegolas

Members


Статус

18 сообщений

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

#4038   2011-03-19 03:10 GMT+3 часа(ов)      
ну вот чёрт, у меня 0 и никак по-другому)


может я incf неправильно обьявляю?

deadlegolas

Members


Статус

18 сообщений

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

#4039   2011-03-19 03:10 GMT+3 часа(ов)      
а не могли бы сделать Dribble в тхт файл? там функция в исклиспе есть

deadlegolas

Members


Статус

18 сообщений

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

#4040   2011-03-19 03:12 GMT+3 часа(ов)      
вот мой полный лог:
Цитата
(defun incf (x) (setq x (+ x 1)))
INCF
> (defun test1 (L)

(let ((retval nil))

(do

((i 0 (1+ i)))

((null (nthcdr i L)) retval)

((lambda (z) (if (atom z)

(incf summ)

(setf retval (append z retval))))

(nth i L)))))
TEST1
>




(defun maintest (Li)

(let ((L Li) (Summ 0))

(do

()

((null L) summ)

(setf L (test1 L)))))
MAINTEST
> (setq summ 0)
0
> (maintest '(1 2 3 (3 4 5)))
0
>

megamanx

Members


Статус

307 сообщений

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

#4041   2011-03-19 03:24 GMT+3 часа(ов)      
я балдею просто. Может тебе почитать сначала книжку, или хотя бы тестить свои приложения?
(defvar x 12)
x
>>12
(defun incf (x) (setq x (+ x 1)))
>>INCF
(incf x)
>>13
x
>>12

incf - изменяет значение, должна быть макросом. Твоя функция делает вид, что изменяет
поменяй везде incf на +, как и раньше, или напиши макрос
(defmacro incf (x) `(setq ,x (+ ,x 1)))

на моих уже полтретьего, бб
I wish I'd made you angry earlier

deadlegolas

Members


Статус

18 сообщений

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

#4042   2011-03-19 03:29 GMT+3 часа(ов)      
спасибо большое, буду разбираться.

Файфель Б.Л.

Members


Статус

61 сообщений
http://homelisp.ru
Где: Russia Саратов
Род занятий: Программист
Возраст: 66

#4043   2011-03-20 20:40 GMT+3 часа(ов)      
Вот примитивно-простое решение:

(defun lstlen (x)

(prog (lst len)

(setq len 0)

(setq lst x)

@ (cond ((null lst) (return len))
(t (setq lst (cdr lst))))

(setq len (+ 1 len))

(go @)

)

)

megamanx

Members


Статус

307 сообщений

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

#4044   2011-03-21 00:12 GMT+3 часа(ов)      
согласился бы, да вот только у меня на sbcl
(lstlen '(a s (d f (g h))))
>>3

поправьте, пжлст
I wish I'd made you angry earlier

Файфель Б.Л.

Members


Статус

61 сообщений
http://homelisp.ru
Где: Russia Саратов
Род занятий: Программист
Возраст: 66

#4045   2011-03-22 03:20 GMT+3 часа(ов)      
Так это правильный ответ: на верхнем уровне Ваш список трехэлементный... Может быть, нужно подсчить не число элементов, а число атомов?


Онлайн :

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