0

こんにちは、8 パズルで A* 検索を行っていますが、主な質問が 2 つあります。

修正済み : まず、for ループのポリモーフの 2 番目の部分の行でこれを実行すると、 clojure.lang.Lazysezを clojure.lang.IFn にキャストできませんが、その理由がわかりません。

これが私のコードです:

(defn a-star

  ([board history]

     (if  (at-end? board) (println board)
    (

          (let [options (filter #(possible-move? % board) *moves*)
                move (into (pm/priority-map) (for [move options] [move (global-man-dis       (move-tile board move))]))]

              (for [pair move :let [next-move (key pair)]] 

                 (do 
                  (println (move-tile board next-move))
                  (a-star (move-tile board next-move) next-move (conj history board))
                 )
              )
          )
    )))



  ([board prev-move history]

     (if (or (at-end? board) (history-check history board)) (println board)
    (

      (let [options (get-queue board (dont-go-back prev-move))
            move (into (pm/priority-map) (for [move options] [move (global-man-dis     (move-tile board move))]))]

        (for [pair move :let [next-move (key pair)]] 

           (do 
            (println (move-tile board next-move))
            (a-star (move-tile board next-move) next-move (conj history board))
           )
         )
       )
     ))))



(defn -main [& args]
  (println "insert a list all numbers no spaces or letters")
  (def board (mapv (fn [^Character c] (Character/digit c 10)) (read-line)))
  ;(def testt [0 8 4 7 2 1 3 5 6])
  ;(def testt [1 2 3 5 4 6 8 0 7])
  (a-star board [])
  )

投稿してから試してみました: let ステートメントの周りの "else" 括弧を削除しましたが、今は何も返さ れませんFIXED else 括弧を削除し、for が遅延していて、この場合は何も出力しないため、dosq に変更しました。別の質問をもう一度個別に聞いてください

4

1 に答える 1

1

a-star の基本ケースの一部は、遅延シーケンスを返します。let ステートメントの周りに余分な括弧のペアがあるため、a-star の出力を関数として呼び出しています。

于 2013-09-24T19:00:56.770 に答える