Я пытаюсь сортировать список многочленов, записанных в таком формате: (M [коэффициент] [общая степень] [Переменный список]).Сортировка полиномов Common Lisp
пример:
((M 1 1 ((V 1 A))) (M 1 2 ((V 1 A) (V 1 C))) (M 1 2 ((V 2 A))) (M 1 2 ((V 1 A) (V 1 B))))
Это: а + а * с + а^2 + а * Ь, мне нужно, чтобы получить + а * Ь + с + а * а^2, потому что * б < а^2 и < а^2.
Я пытался использовать функцию сортировки, но мой вывод:
((M 1 1 ((V 1 A))) (M 1 2 ((V 2 A))) (M 1 2 ((V 1 A) (V 1 B))) (M 1 2 ((V 1 A) (V 1 C))))
что а + а^2 + а * Ь + a * c.
Я использую:
(defun sort-poly (a b)
(cond
(t (sort-poly-helper (varpowers a) (varpowers b)))))
(defun sort-poly-helper (a b)
(cond
((null a) (not (null b)))
((null b) nil)
((equal (third(first a)) (third(first b))) (sort-poly-helper (rest a) (rest b)))
(t (sort (list (third(first a)) (third(first b))) #'string-lessp))))
с:
(sort '((M 1 1 ((V 1 A))) (M 1 2 ((V 1 A) (V 1 C))) (M 1 2 ((V 2 A))) (M 1 2 ((V 1 A) (V 1 B)))) #'sort-poly)
помощь? Thanks
Я представил редактирование для вашего кода. Обычный стиль Lisp не должен оставлять конечные скобки на их собственных линиях. Кроме того, во время переформатирования я заметил подозрительные вещи, такие как 'cond' с только условием' t' в 'sort-poly' и' cond' clause '()', который в то время как действителен очень странно и никогда ничего не сделает. – verdammelt
спасибо. вы правы, они были просто «ошибками» неопытности. Я новичок в lisp. – Davide