1

私は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) )   
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 に答える