我真的很喜欢使用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) )
答案 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上发帖时,你真的应完整地包含错误信息。请总是以后这样做。)