Haskell 例外:前奏曲。最后:哈斯凯尔解决8皇后的空列表?
我正在解决Haskell中的8皇后问题,只使用基本函数,没有什么特别的Haskell 例外:前奏曲。最后:哈斯凯尔解决8皇后的空列表?,haskell,functional-programming,n-queens,Haskell,Functional Programming,N Queens,我正在解决Haskell中的8皇后问题,只使用基本函数,没有什么特别的 代码如下: 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]
代码如下:
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
谁能帮帮我吗??提前感谢您所做的一切:)您可以通过在调用
last
之前检查xs
的长度来解决眼前的问题:
safeD l e xs n = if length xs == 0 || last(xs)/=e then ...
但是,您将遇到另一个问题,因为您在内调用safeD(tail-xs)(head-xs)(tail-xs)(1)
,然后调用该分支的部分,当长度xs==0时,您可以访问该分支的然后部分
我强烈建议学习一点关于模式匹配(,)的知识,并尝试编写整个代码段,而不要调用head
、tail
、init
、last
或length
。相反,将两种模式[]
用于匹配空列表,将(x:xs)
(或类似模式)用于匹配以x
开头并以xs
结尾的列表;如有必要,可以偶尔调用reverse
祝你好运,让我们知道你的遭遇和你被困的地方 您可以通过在调用last
之前检查xs
的长度来解决眼前的问题:
safeD l e xs n = if length xs == 0 || last(xs)/=e then ...
但是,您将遇到另一个问题,因为您在内调用safeD(tail-xs)(head-xs)(tail-xs)(1)
,然后调用该分支的部分,当长度xs==0时,您可以访问该分支的然后部分
我强烈建议学习一点关于模式匹配(,)的知识,并尝试编写整个代码段,而不要调用head
、tail
、init
、last
或length
。相反,将两种模式[]
用于匹配空列表,将(x:xs)
(或类似模式)用于匹配以x
开头并以xs
结尾的列表;如有必要,可以偶尔调用reverse
祝你好运,让我们知道你的遭遇和你被困的地方 有没有想过先为零皇后解决这个问题
那么一个女王呢
然后找出归纳/递归模式?。。我没有引用三行解决方案,因为它看起来像你的家庭作业。有没有想过先为零皇后解决这个问题
那么一个女王呢
然后找出归纳/递归模式?。。我不是在引用三行解决方案,因为它看起来像你的家庭作业。你与MHD有关系吗?也许是走同样的路?这看起来很像。@JoachimBreitner是的,先生,我们是一个试图解决这个问题的团队,但他不知道该问谁这个问题??你和MHD有关系吗?也许是走同样的路?这看起来很像。@JoachimBreitner是的,先生,我们是一个试图解决这个问题的团队,但他不知道该问谁这个问题??