我真的是使用 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) )