1

我真的是使用 Haskell 的新手。我正在尝试编写一个 h4 函数,它将计算使用 4 桩完成河内塔的最小步骤。我已经知道如何使用 3 堆或 h3 来计算它。我的主要问题是使用列表理解并返回最小值,还使用记忆化来确保我可以快速运行我的代码。当我运行我的 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 -> Integer

--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) )   
4

1 回答 1

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 上发帖时,你真的应该完整地包含错误消息。以后请务必这样做。)

于 2014-02-25T05:37:42.133 回答