Lisp の問題がわかりません
次の問題のプログラムを教えてください。
《多項式のかけ算》
1つの変数を含む線形多項式のかけ算を行なう関数 poly-times を定義する.
多項式は例えば
2x^4 - x^3 + x^2 + x-1 →
(+ (* 2 X X X X) (* -1 X X X) (* X X) X -1)
2x4 - x3 + x2 + x-1 →
(+ (* 2 X X X X) (* -1 X X X) (* X X) X -1)
のように LISP の式で表現するものとする. すなわち, 第1要素が " +", 第2要素以降が項であるようなリストである. 演算子は +, * のみとし, -, / は使わない. 変数には X というシンボルを用いる. 項は, 整数, シンボル X, あるいは, 第1要素が "*" であるリストのいずれかであり, リストの場合, 第2要素に整数が入り第3要素以降は X, あるいは, 第2要素以降が X であるものとする.
(実行例)
>(poly-times '(+ X 2) '(+ X -2))
(+ (* X X) -4)
>(poly-times '(+ (* 2 X X) X 5) '(+ (* X X) (* -5 X) 3))
(+ (* 2 X X X X) (* -9 X X X) (* 6 X X) (* -22 X) 15)
各項をかけ合わせてそれらの和をとればよいので, 2つの項をかける関数とか, 多項式と項を足す関数などを作って組み合わせれば できそうです.
たとえば,
(defun poly-times (x y &aux z)
(dotimes (i (length (cdr x))) (dotimes (j (length (cdr y)))
(setf z (embed-term (term-times (nth i (cdr x)) (nth j (cdr y))) z))))
(cons '+ z))
などと定義しておいて, 項同士のかけ算を実行する関数 term-times と, 1つの項を多項式に加える関数 embed-term をうまく定義してやれば 完成です.
自分でも試してみましたが、場合分けなどが多く、解けませんでした。
わかる方の御協力をお願いいたします。
お礼
こんなに早く答えて頂ける方がいるとは思いませんでした! 論理的で非常に判りやすいご説明で感動しました! なかなか面白い問題でした! ありがとうございました!!