我想知道如何用haskell编写代码,以了解如何为n个“盘”和3根棒(A、B、C)编写多个动作。
基箱( N=1):移动A->CSO1运动
归纳案例(N= M+1 ):我将M盘"A“-> "C”移动了1张光盘"A“-> "B”,最后我将M盘从"C“移动到"B”。我以为德码可能是这样的:
numMoveHanoi 0 = 0
numMoveHanoi 1 = 1
numMoveHanoi n = m+1 + numMoveHanoi m
where m = n-1不幸的是,这只适用于numMoveHanoi 2 .Other案例,结果是错误的。我不知道我的递归定义哪里错了。
谢谢大家。
发布于 2013-10-27 17:22:53
好吧,试着把你的英语和你的Haskell排好。
numMoveHanoi {- Base case ( N=1) -} 1
= {- Movement A --> C so 1 movement -} 1
numMoveHanoi {- Inductive case -} n
= {- I move M discs "A" ---> "C" -} m
+ {- I move 1 disc "A" ---> "B" -} 1
+ {- I move M discs from "C" to "B" -} numMoveHanoi m
where {- ( N = M+1 ) -} m = n-1现在,比较一下numMoveHanoi第一句和第三句中的英语。然后比较numMoveHanoi第一和第三从句中的Haskell。
)作为练习:比较第二和第三从句中的英语。然后比较Haskell在第二和第三条款。这是同一个bug的实例吗?为什么或为什么不?)
发布于 2013-10-29 01:37:59
想一想河内塔的递归解决方案:要解决一个有n个磁盘的塔,将上面的n-1光盘移动到备用平台(numMoveHanoi ( n-1 )),移动第n个磁盘(1),并将n个磁盘顶部的n-1磁盘移动到第n块的顶部(numMoveHanoi (n-1))。那么你的一般情况是:
numMovesHanoi n = numMoveHanoi (n-1) + 1 + numMoveHanoi (n-1)
{- or numMovesHanoi n = 2 * numMoveHanoi (n-1) + 1 -}https://stackoverflow.com/questions/19619914
复制相似问题