私はHaskellを使用するのは本当に初めてです。4 つの杭を使用してハノイの塔を完成させるための最小ステップを計算する h4 関数を作成しようとしていました。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.
すべての助けとアドバイスに感謝します。メモ化された関数を追加して h4 関数を改善し、確実に出力を高速化することにしました。h4 メモ化関数を実行すると、次のエラーが発生します: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) )