2016-10-28 15 views
0

私が持っている16の数字のリストをとり、それを4つの要素のリストに入れて、マジックスクエアのゲームボードを表現しようとしています。私はリストを取って単一のサブリストを返すメソッドを作ったので、今ではこのメソッドを再帰的に使ってフルボードを構築しようとしています。lisp:単一のリストからリストのリストを作成する

しかし私の問題は、私のinitBoardは何を問わず何も返しませんし、他のすべてのメソッドが必要に応じて動作していることを知っています。私のエラーを明確にしていただければ幸いです!

(4 5 15 10 14 11 1 8 9 16 6 3 7 2 12 13)

そして、何出力であるように、私がしたい:

もここで、例えば入力リストであります

((4 5 15 10)(14 11 1 8)(9 16 6 3)(7 2 12 13))

(defun smallList (lst cnt) 
    (cond ((>= cnt 4) nil) 
    (t (cons (car lst) (smallList (cdr lst) (+ 1 cnt)))))) 

(defun isEmpty (lst) 
    (if lst 1 -1)) 

(defun initBoard (lst) 
    (cond ((= (isEmpty lst) -1) nil) 
    (t (cons (smallList lst 0) (initBoard (cddddr lst)))))) 

答えて

0

ので、私はあなたの3つの機能をテストし、それは私に正しい出力を与えおそらくあなたの問題はあなたが思うところではないでしょう。

(initBoard '(4 5 15 10 14 11 1 8 9 16 6 3 7 2 12 13)) 

=>((4 5 15 10) (14 11 1 8) (9 16 6 3) (7 2 12 13))

+0

私はあなたの例に対して持っているもので、一度の違いは、おそらくいくつかの並べ替えを引き起こしていること問題の?編集:あなたが投稿した行はまだ返されませんnil、あなたは骨組みを使用していますか? –

+0

いいえ、SBCLを使用していますが、どちらも標準に準拠しており、これが標準コードです。私はブランクのREPLを起動し、あなたが私に与えた機能を貼り付けてから、その行を実行しました。 – djeis

+0

私は考えましたが、私はちょうどチェックしたかったのです。これは非常に奇妙なことです。投稿されたコードは、私が書いたコードから直接コピーされたものです。コピーしたコードを貼り付けて、作業を開始しました。 –

1

いくつかの発言:

  • someListlstcntsome-listlistを使用し、慣用ないが、count
  • あなたはただ、is-emptyを必要としませんendpまたはnullを使用してください。 booleanを返します(-1でも1でもない)。あなたがしたい場合は、エイリアスを作る(なぜ?)でした:

    (setf (symbol-function 'is-empty) #'endp) 
    

あなたはsmall-listのためのループを使用することができます。

(defun small-list (list) 
    (values (loop repeat 4 collect (pop list)) list)) 

二値は、リストの残りの部分であるので、あなたはcddddrする必要はありません。

しかし、実際には、一つの関数内でボード全体を初期化する方がよいかもしれませんが:

(defun init-board (list) 
    (loop repeat 4 collect 
     (loop repeat 4 collect (pop list)))) 

最初LOOPは、内側LOOPによって収集されている4つの要素のリストを集めます。収集された要素は入力リストからポップされます。 私は非常に慎重になりたい場合は今、私はいくつかのチェックを追加し、悪い入力にエラーを報告する:

(defun init-board (list) 
    (flet ((failure() 
      (error "Input list should contain exactly 16 integers: ~S" 
        list))) 
    (loop 
     with current = list 
     repeat 4 collect 
     (loop 
      repeat 4 
      collect (if current 
         (let ((element (pop current))) 
          (check-type element integer) 
          element) 
         (failure))) 
     into board 
     finally (if list (failure) (return board))))) 

また、私はボード用の多次元配列を使用します。

(make-array '(4 4) :initial-contents (init-board list)) 
+0

リストとして定義されている関数があるので、リストの使用は避けてください。 isEmptyを避ける方法を指摘してくれてありがとう。私はむしろ2次元の配列とループを使いたいと思いますが、残念なことにリストと再帰を要求しています。 –

+1

@DShuler私は理解していますが、あなたがSchemeのバックグラウンドから来た場合に備えて、 '(lambda(リスト)(リストリスト))'はCLでうまく動作し、あいまいではありません。 – coredump

0
私は、次の再帰関数使用します

:、私は、私はsetqとして定義されたリストを渡している

(defun smalllist (l n) 
    (when l 
     (cons (subseq l 0 (min n (length l))) 
      (smalllist (nthcdr n l) n)))) 
まあ
関連する問題