Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Программирование [игнор отключен] [закрыт для гостей] / lisp перемножить многочлены / 25 сообщений из 30, страница 1 из 2
02.05.2008, 17:03
    #35290616
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Нужно реализовать функцию перемножения многочленов, если многочлены задаются в виде списков их коэффициентов. Помогите, пожалуйста, очень нужно!
...
Рейтинг: 0 / 0
02.05.2008, 18:32
    #35290695
Fatty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
не совсем ясно как выглядят эти списки
но подозреваю, что следующее выражение
должно выполнить эту задачу:

Код: plaintext
(mapcar '* list_1 list_2)

~'J'~
...
Рейтинг: 0 / 0
02.05.2008, 21:34
    #35290806
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Знаете, это моя первая задача на lisp, поэтому я думаю, что препода не удовлетворит такое решение задачи. Вообще- то, мне кажется, что там ( в этих списках ) должны быть просто числа со знаками, которые нужно правильно перемножить и сложить, а затем объединить всё в один список, но я понятия не имею как это сделать...
Подскажите, пожалуйста, ещё.
...
Рейтинг: 0 / 0
02.05.2008, 23:18
    #35290845
Fatty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Покажи свои списки, тогда может смогу помочь

~'J'~
...
Рейтинг: 0 / 0
03.05.2008, 12:15
    #35290965
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Любые списки, с какими сможешь с такими и подскажи.
Например, (2,-3,4) и (7,2,0).
...
Рейтинг: 0 / 0
03.05.2008, 16:08
    #35291084
Fatty
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Ну то же самое фактически:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
;; multy1
(defun multy1  (lst1 lst2)
  (cond	((or (null lst1) (null lst2)) nil)
	((and (atom (car lst1)) (atom (car lst2)))
	 (cons (* (car lst1) (car lst2))
	       (multy1 (cdr lst1) (cdr lst2))))
	(t
	 (cons (* (car lst1) (car lst2))
	       (multy1 (cdr lst1) (cdr lst2))))))
;; multy2
(defun multy2  (lst1 lst2)
  (mapcar '* lst1 lst2)
  )

;usage:

(setq result1 (multy1 '( 2  - 3   4 ) '(7 2 0)))
(setq result2 (multy2 '( 2  - 3   4 ) '( 7   2   0 )))

~'J'~
...
Рейтинг: 0 / 0
07.05.2008, 13:22
    #35299568
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Во-первых, объясните, пожалуйста, что это за t и для чего оно нужно.
Во-вторых, что мы получим в результате? У меня MIT/GNU Scheme не знаете как там запустить?
...
Рейтинг: 0 / 0
07.05.2008, 14:23
    #35299846
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
sotnyВо-первых, объясните, пожалуйста, что это за t и для чего оно нужно.
Во-вторых, что мы получим в результате? У меня MIT/GNU Scheme не знаете как там запустить?

1. t это ИСТИНА :)
2. Переписать на MIT Scheme Например defun превратиться в define, а t в #t (есть и более существенные отличия)

Если у тебя Схема, то и спрашивать надо было для схемы, а не для Лиспу
...
Рейтинг: 0 / 0
07.05.2008, 21:00
    #35300965
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Я же написала, что это моя первая задача. То, что вы сказали я исправила, но все равно не работает. ВОТ, что я исправила:
(define (multy1 lst1 lst2)
;null проверяет, является ли аргумент пустым списком
(cond ((or (null lst1) (null lst2)) nil)
((and (atom (car lst1)) (atom (car lst2)))
(cons (* (car lst1) (car lst2))
(multy1 (cdr lst1) (cdr lst2))
)
)
(#t
(cons (* (car lst1) (car lst2))
(multy1 (cdr lst1) (cdr lst2))
)
)
)
)
(setq result1 (multy1 `(2 -3 4) `(7 2 0)))
Пишет Unbound variable:null.
В чем дело, подскажите:(
...
Рейтинг: 0 / 0
07.05.2008, 23:49
    #35301152
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
sotny пишет:

> Я же написала, что это моя первая задача. То, что вы сказали я

Девушка, Scheme и LISP - немного разные вещи.
Вам написали программу на Common Lisp. Когда говорят "LISP"
в основном сейчас подразумевают Common Lisp.
Так что вам придется немного подкрутить ее на схему.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
08.05.2008, 12:36
    #35302189
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Просто, в универе нам читали лекции и говорили, что это лекции по Лиспу, а оказалось, что они были по Схеме. Как переписать с Лиспа на схему я разобралась. Но функция работает не правильно. Например, если есть 2 списка: (1 2) и ( 3 4), то она 1*3 и 2*4, а надо: 1*3, 1*4, 2*3, 2*4.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
(define (multy1 lst1 lst2)
;null  проверяет, является ли аргумент пустым списком
  (cond	
    ((or (null? lst1) (null? lst2)) `())
	((and (if (=  1  (length lst1)) (car lst1)) (if (=  1  (length lst2)) (car lst2)))
	 (cons (* (car lst1) (car lst2))
	       (multy1 (cdr lst1) (cdr lst2))
        )
	)
	(#t
	 (cons (* (car lst1) (car lst2))
	       (multy1 (cdr lst1) (cdr lst2))
	    )
	)
  )
)
(multy1 `( 1   2 ) `( 3   4 ))
Подскажите, пожалуйста, как изменить.
...
Рейтинг: 0 / 0
08.05.2008, 14:40
    #35302612
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
sotny пишет:

> Просто, в универе нам читали лекции и говорили, что это лекции по Лиспу,
> а оказалось, что они были по Схеме.

Языка программирования LISP не существует. LISP - это и идея.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
10.05.2008, 13:37
    #35304347
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
sotnyПросто, в универе нам читали лекции и говорили, что это лекции по Лиспу, а оказалось, что они были по Схеме. Как переписать с Лиспа на схему я разобралась. Но функция работает не правильно. Например, если есть 2 списка: (1 2) и ( 3 4), то она 1*3 и 2*4, а надо: 1*3, 1*4, 2*3, 2*4.


Так:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
(define (multy a b)
  (define (multb r a b)
    (cond ((null? b) r)
          (else (multb (append r (list (* a (car b))))
                       a (cdr b))))
  )
  (define (multa r a)
    (cond ((null? a) r)
          (else (multa (append r (multb '() (car a) b))
                       (cdr a))))
  )
  (multa '() a)
)
...
Рейтинг: 0 / 0
13.05.2008, 21:15
    #35310202
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Спасибо огромное!!!!!!!
...
Рейтинг: 0 / 0
14.05.2008, 12:13
    #35311293
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
А, если нужно ещё привести подобные? Например, (x+2)*(3x+4), следовательно, списки получаются `(1 2) `(3 4), а результат должен быть следующим (3 10 8). Если кто может помогите, пожалуйста!!!!!!!!!!!!!!!!!!!!!!!!!
...
Рейтинг: 0 / 0
15.05.2008, 18:08
    #35315355
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Попробовала вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
(define (mult lst1 lst2 res)
(define (multy1 lst1 lst2 r )
  (cond	
    ((or (null? lst1) (null? lst2)) `())
	(
	 (append r (map (lambda (x) (* (car lst1) x )) lst2) 
	       (multy1 (cdr lst1) lst2 r )
        )
	)
  )
 )
(multy1 lst1 lst2 `() )
(append res ((car r)(+(car(cdr r))(car(cdr(cdr r))))(car(cdr(cdr(cdr r))))))
)

(mult `( 1   2 ) `( 3   4 )`())
Пишет: Unbound variable:r. Не почему?
...
Рейтинг: 0 / 0
16.05.2008, 07:32
    #35315855
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
(append res ((car r)(+(car(cdr r))(car(cdr(cdr r))))(car(cdr(cdr(cdr r))))))

ни с чем не связано
(car (cdr (car blah-blah-blah))) -> (cadar blah-blah-blah)

а то уж слишком брутально
...
Рейтинг: 0 / 0
16.05.2008, 07:34
    #35315858
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
есть некоторые сомнения в том что вы правильно понимаете блочную структуру
...
Рейтинг: 0 / 0
16.05.2008, 07:42
    #35315861
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
отсутствие else в cond тоже несколько смущает
медитирую над map-ой (никак не могу понять что за задачу вы решали и почему так ... замороченно) ?
...
Рейтинг: 0 / 0
16.05.2008, 12:18
    #35316651
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Функция map берет элемент из первого списка и умножает его на каждый элемент второго списка.
Я не знаю как результат выполнения этой функции запихнуть в другой список, например, res и как потом по нему пройтись, чтобы это было связано?
...
Рейтинг: 0 / 0
16.05.2008, 14:09
    #35317156
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
sotnyФункция map берет элемент из первого списка и умножает его на каждый элемент второго списка.
Я не знаю как результат выполнения этой функции запихнуть в другой список, например, res и как потом по нему пройтись, чтобы это было связано?

Очевидно вызвав одну функцию из другой ?
Отвыкайте мыслить императивно, добро пожаловать в ФП ;)

Имеется сахар:

Код: plaintext
1.
2.
3.
(let ((var value))
   (f value)
)

который на самом деле:

Код: plaintext
1.
((lambda (var) (f var)) value)

Вы делаете парррразительные успехи (c) Кавказская пленница
...
Рейтинг: 0 / 0
17.05.2008, 23:11
    #35318993
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Написала вот так:
Код: plaintext
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.
(define (multy1 lst1 lst2 r)
;null  проверяет, является ли аргумент пустым списком
  ( 
  cond	
    ((or (null? lst1) (null? lst2)) `())
	(else
	 (let(res (concat  (cons (map (lambda (x) (* (car lst1) x )) lst2) 
	       (multy1 (cdr lst1) lst2 r)) r))(pod res)
        )
	)

  )
    
  )
  
(define (concat A B)
   (cond
      ((null? A) 
         (cond
             ((null? B) `())
             (else (concat B `()))
         ))
      (else (cons (car A) (concat (cdr A) B)))
   )
)
(define (copy l1 l2)
 ())

(define (pod alist)
 (append ((car alist)(+(cadr alist)(caddr alist))(cadddr alist)))
)

(multy1 `( 1   2 ) `(  3   4 ) `() )
Выдает:
ILL-FORMED special form: (let (res...)(pod res))
...
Рейтинг: 0 / 0
19.05.2008, 08:55
    #35319837
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
sotny
(let(res (concat (cons (map (lambda (x) (* (car lst1) x )) lst2)


let выглядит так:

Код: plaintext
1.
2.
3.
4.
(let ((var- 1  (...))
       (var- 2  (...) ...)
   ...
)

В общем-то по сообщению об ошибке можно было догадаться (как и в прошлый раз)
...
Рейтинг: 0 / 0
19.05.2008, 09:01
    #35319842
Gluk (Kazan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
тьфу, не ту скобку выделил :(
но мысль я думаю ясна
...
Рейтинг: 0 / 0
19.05.2008, 22:06
    #35321945
sotny
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
lisp перемножить многочлены
Блин, ну не догоняю я как использовать этот Let, что я уже только не пробовала:
Код: plaintext
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.
(define (multy1 lst1 lst2 r)
  ( 
  cond	
    ((or (null? lst1) (null? lst2)) `())
	(else
	 (concat  (append 
	                     (map (lambda (x) (* (car lst1) x )) lst2) 
	                     (multy1 (cdr lst1) lst2 r)
						) r
	    )
    )
  )
 (let ((res (r)) (pod res))   
 )
)

(define (concat A B)
   (cond
      ((null? A) 
         (cond
             ((null? B) `())
             (else (concat B `()))
         ))
      (else (cons (car A) (concat (cdr A) B)))
   )
)

(define (pod alist)
 (append ((car alist)(+(cadr alist)(caddr alist))(cadddr alist)))
)

(multy1 `( 1   2 ) `(  3   4 ) `() )
Выдает:
ILL-FORMED special form: (let (... ...))
Ну в чем в конце-то концов дело?
...
Рейтинг: 0 / 0
Форумы / Программирование [игнор отключен] [закрыт для гостей] / lisp перемножить многочлены / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]