1

基本的な関数のみを使用して Haskell の 8-queens 問題を解決して
います。これはコードです。

queens = [[x1,x2,x3,x4,x5,x6,x7,x8]|x1<-[1..8],x2<-[1..8],x3<-[1..8],x4<-[1..8],x5<-[1..8],x6<-[1..8],x7<-[1..8],x8<-[1..8],safeH [x2,x3,x4,x5,x6,x7,x8] x1,safeD [x2,x3,x4,x5,x6,x7,x8] x1 [x1,x2,x3,x4,x5,x6,x7,x8] 1] 
safeH l e = if elem e l then False 
            else if length (l)/=0 then safeH(tail l)(head l) 
                    else True
safeD l e xs n = if last(xs)/=e || length xs == 0 then
                if length(l)/=0 then 
                    if (head(l)+n==e || head(l)-n==e) then False 
                    else safeD(tail l)(e)(xs)(n+1) 
                else safeD(tail xs)(head xs)(tail xs)(1)
            else True

クイーンが同じ行にないことを関数がチェックすることを明確にするために、SafeHH は Horizantly を表し、SafeDは斜めの競合をチェックすることになっています。関数は問題なく問題ないと
確信しており 、コードをコンパイルすると問題は発生しませんが、呼び出し時に このエラーが表示される関数:SafeHSafeD
queens

[1 of 1] Compiling Main             ( y.hs, interpreted )
Ok, modules loaded: Main.
*Main> queens
*** Exception: Prelude.last: empty list

誰でも私を助けてもらえますか?? すべてのことを前もって感謝します:)

4

2 に答える 2

5

xsを呼び出す前にの長さを確認することで、差し迫った問題を解決できますlast

safeD l e xs n = if length xs == 0 || last(xs)/=e then ...

ただし、このブランチの一部safeD(tail xs)(head xs)(tail xs)(1)内で呼び出すため、別の問題が発生します。このブランチの一部には.thenthenlength xs == 0

パターン マッチングについて少し学び ( Gentle Intro セクションHaskell Report セクション)、このコード スニペット全体をhead, tail, init, last, またはlength. 代わりに、[]空のリストに一致する 2 つのパターンと(x:xs)(または同様の) で始まり;xで終わるリストに一致する 2 つのパターンを使用します。xs必要に応じて、たまに電話してreverseも問題ありません。

頑張ってください。あなたの調子と行き詰った場所を教えてください!

于 2013-08-20T21:19:31.147 に答える
3

最初にゼロ クイーンの場合にこの問題を解決することを考えたことはありますか?

では、1人の女王のために?

次に、帰納的/再帰的なパターンを見つけますか?..それはあなたの宿題のように見えるので、私は 3 ライナー ソリューションを引用していません。

于 2013-08-21T16:13:08.187 に答える