河内 - 哈斯克尔塔

时间:2014-02-25 03:50:39

标签: haskell list-comprehension pseudocode towers-of-hanoi

我真的很喜欢使用Haskell。我试图编写一个h4函数,它将使用4个桩计算完成河内塔的最小步骤。我已经知道如何用3桩或h3来计算它。我的主要问题是使用列表推导并返回最小值,并使用Memoization确保我可以快速运行我的代码。我忘了包含我运行h4功能时出错。它说“|”存在问题。我是haskell的新手,无法调试,因为我不确定是什么问题。

这就是我的内容:我的h3功能正常。我需要帮助主要是我的h4

h3 :: Int -> Integer
h3 0 = 0
h3 n = 2 * h3 (n - 1) + 1

h4 :: Int -> Integer
h4 0 = 0
h4 n = 2 * h4 (k) + h3 (n - k) | k <- [0..n-1]          
h4 n = minimum [2 * h4 (k) + h3 (n - k) | k <- [0..n-1] ]

我的伪代码是:

Function H4 (n): 
 if n < = 0 then return 0 
 else 
 for k from 0 to n - 1 
 calculate the value of 2 * H4 (k) + H3 (n - k) 
 create a list containing these n values 
 return the minimum value of the list. 

我感谢所有的帮助和建议。我决定通过添加memoized函数来改进我的h4功能,以确保我的输出更快。当我运行我的h4 memoized函数时,我得到这个错误:16:1:不在范围内:`memoized_h4'h3 :: Int - &gt;整数

--h3 function
h3 0 = 0
h3 n = 2 * h3 (n - 1) + 1

h4 :: Int -> Integer                --h4 function
h4 0 = 0
h4 n = minimum [2 * h4 (k) + h3 (n - k) | k <- [0..n-1] ]

main :: IO ()
main = print $ h4 4

--memoized h4
memoized_h4 :: Int -> Integer
memoized_h4 = (map 1H4 [0..] !!)
          where 1H4 0 = 0
1H4 n = memoized_h4 h3 (n - k) | k <- [0..n-1]        + memoized_h4 (2 * h4 (k) )   

1 个答案:

答案 0 :(得分:3)

至于你的语法错误,这里是你的代码,重新签名:

h4 :: Int -> Integer
h4 0 = 0
h4 n =          2 * h4 (k) + h3 (n - k) | k <- [0..n-1]          
h4 n = minimum [2 * h4 (k) + h3 (n - k) | k <- [0..n-1] ]

现在更容易看到缺少的东西。 |这是列表理解的一部分,即它出现在[ .... ]内。它不能单独出现在这里。

上面的第3行是错误的,但可能根本不需要。

(当你在SO上发帖时,你真的完整地包含错误信息。请总是以后这样做。)