Yas*_*deh 1 haskell functional-programming n-queens
我正在使用基本函数解决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
Run Code Online (Sandbox Code Playgroud)
为了澄清SafeH函数检查,没有皇后在同一行H代表Horizantly而SafeD应该检查对角线冲突
我确信该SafeH函数没问题,SafeD
编译代码时它没有问题但是在调用时
它给我这个错误的queens函数
:
[1 of 1] Compiling Main ( y.hs, interpreted )
Ok, modules loaded: Main.
*Main> queens
*** Exception: Prelude.last: empty list
Run Code Online (Sandbox Code Playgroud)
谁能帮帮我吗??事先感谢每件事:)
您可以通过检查xs调用之前的长度来解决紧急问题last:
safeD l e xs n = if length xs == 0 || last(xs)/=e then ...
Run Code Online (Sandbox Code Playgroud)
但是,您将遇到另一个问题,因为您safeD(tail xs)(head xs)(tail xs)(1)在then此分支的部分内部调用,并且您可以在then何时到达此分支的一部分length xs == 0.
我强烈建议学习模式匹配(一点点温柔的介绍部分,哈斯克尔报告部分),并努力写出整个代码段而不用调用head,tail,init,last,或length.相反,使用两个模式[]匹配空列表和(x:xs)(或类似)匹配开始x和结束的列表xs; 如有必要,reverse偶尔打一次电话就可以了.
祝你好运,让我们知道你的票价和陷入困境的地方!
| 归档时间: |
|
| 查看次数: |
1562 次 |
| 最近记录: |