行列を定義した後:
(setq matriz '((1 0 0 0 0 0)
(1 1 0 0 0 0)
(0 1 1 1 0 0)
(0 0 0 1 0 0)
(0 0 0 1 1 0)
(0 0 0 0 1 1)))
位置 (行と列) に応じて数値を取得する関数を既に作成しましたが、位置に応じてマトリックス内の数値を置き換える関数を実行したいのですが、問題が発生しています。(0 0 0 1 0 0) の 1 に対応する位置 (3 3) を置き換えたいとしましょう。その方法がわかりません。循環がないことを意味する再帰関数のみを使用できます。私が取り組んでいるこれは、迷路ソルバー用です。助けていただければ幸いです:=)
:編集部分これは私がこれまでに持っているものです
(setq matriz '((1 0 0 0 0 0)(1 1 0 0 0 0)(0 1 1 1 0 0)(0 0 0 1 0 0)(0 0 0 1 1 0)(0 0 0 0 1 1)))
(defun path(i j)
(list (list (+ i 1) j)
(list (- i 1) j)
(list i (+ j 1))
(list i (- j 1))
))
(defun validsons (lf mat)
(cond
((null lf) nil)
((eq (devposmat (caar lf) (cadar lf) mat) 1) (cons (car lf) (validsons (cdr lf) mat)))
(t (validsons (cdr lf) mat))
)
)
(defun Devposicao(i lista)
(cond
((null lista) nil)
((< i 0) nil)
((= i 0) (car lista))
(t (Devposicao (- i 1) (cdr lista)))))
(defun DevPosMat(i j lista)
(Devposicao j (Devposicao i lista)))
; 利用可能なパスを表示します (1 のみ)
(defun rightpath(i j mat)
(validsons (path i j) mat)
)
;したがって、リストではなくマトリックスが正しく表示されます
(defun writematrix(Mat)
(cond
((null Mat) nil)
(t (progn
(print (car Mat))
(writematrix (cdr Mat))))
)
)
;これは私が置き換えようとしていたものです
(defun changenumber (i j matriz)
(cond
((null matriz) nil)
((< i 0) nil)
((= i 0) (dec j (car matriz)))
(t (changenumber (- i 1) j (cdr matriz)))))
(defun dec (pos l)
(cond
((null l) nil)
((= pos 0) (cons (- (car l) 1) (cdr l)))
(t (cons (car l) (dec (- pos 1) (cdr l))))))
したがって、rightpath を使用して前方に移動し、利用可能なパスを確認できますが、以前の場所を編集する必要があるため、以前の位置に移動し続ける必要はありません。慣れていないので間違った方法で投稿したらごめんなさい。