我正在寫一個簡化多項式的程序,現在只是加法和乘法。lisp簡化多項式
我一直在敲我的頭,鍵盤幾個小時了,現在是時候請求一些幫助。
(defun simplify (lis)
(if (eq (car lis) '+)
(cons '+ (simplify-addition (cdr lis)))
(if (eq (car lis) '*)
(cons '* (simplify-multiplication (cdr lis)))
)
)
)
(defun simplify-addition (lis)
(if (not (null lis))
(if (listp (car lis))
(list (simplify (car lis)) (simplify-addition (cdr lis)))
(if (numberp (car lis))
(if (eq (car lis) 0)
(simplify-addition (cdr lis))
(if (null (cdr lis))
lis
(cons (car lis) (simplify-addition (cdr lis)))
)
)
(if (eq (car lis) '+)
(list (car lis) (simplify-addition (cdr lis)))
(if (eq (car lis) '*)
(list (car lis) (simplify-addition (cdr lis)))
lis
)
)
)
)
)
)
(defun simplify-multiplication (lis)
(if (not (null lis))
(if (listp (car lis))
(if (find 0 (car lis))
0
(list (simplify (car lis)) (simplify-multiplication (cdr lis)))
)
(if (numberp (car lis))
(if (null (cdr lis))
lis
(cons (car lis) (simplify-multiplication (cdr lis)))
)
(if (eq (car lis) '+)
(list (car lis) (simplify-multiplication (cdr lis)))
(if (eq (car lis) '*)
(list (car lis) (simplify-multiplication (cdr lis)))
lis
)
)
)
)
)
)
這是應該發生的事情:
(simplify ‘(+ x (+ 0 3) (* 1 5) (* (* x y z) 0) )) --> (+ x 3 5)
(simplify ‘(* (+ 6 0) (* 1 6 2))) --------------------------------> (* 6 (* 6 2))
而是我要麼收到我寄給在相同的多項式,或是完全關閉
編輯: 我需要的簡化是從添加中刪除0,以便:
(+ 3 0) --> 3
(+ 4 0 6) --> (+ 4 6)
和mul帶零點的剔除被刪除
(* 6 0 7) --> 0
+1爲你的縮進風格,-1爲不說你得到了什麼結果 – melpomene
所以你只能簡化一個級別?我問,因爲在你的第二個例子中,結果可以簡化爲72,但你只能直到(* 6(* 6 2)) – RonaldBarzell
我更新了更具體的功能應該做的問題。 – cocopuffs