Haskell学習ノート-10:高精度除算、配列列挙アルゴリズム実現

3298 ワード

練習1関数divDecimal a b cを記述し、a/bを計算し、cビット小数を保持する.
divDecimal a b c = (div a b):(div3' (10*(mod a b)) b c)
    where   div3' a b 0 = []
            div3' a b c = (div a b):(div3' (10*(mod a b)) b (c-1))

>> divDecimal 5 7 20
[0,7,1,4,2,8,5,7,1,4,2,8,5,7,1,4,2,8,5,7,1]

練習2関数array n listを記述し,リストリストリストからn個の要素構造を選択してすべて配列する.この例では,リスト導出式,折りたたみfold,マッピングmapなどの機能を用いて,関数実装方法を簡略化した.
array 0 list  = [[]]
array n list =  foldl (++) [] [map (++[x]) (array (n-1) (listsub list x)) | x > array 5 [1,2,3]
[]

>> array 1 [1,2,3]
[[1],[2],[3]]

>> array 2 [1,2,3]
[[2,1],[3,1],[1,2],[3,2],[1,3],[2,3]]

>> array 3 [1,2,3]
[[3,2,1],[2,3,1],[3,1,2],[1,3,2],[2,1,3],[1,2,3]]

>> array 3 [1,2,3,4,5]
[[3,2,1],[4,2,1],[5,2,1],[2,3,1],[4,3,1],[5,3,1],[2,4,1],[3,4,1],[5,4,1],[2,5,1]
,[4,1,3],[5,1,3],[1,2,3],[4,2,3],[5,2,3],[1,4,3],[2,4,3],[5,4,3],[1,5,3],[2,5,3]
,[4,1,5],[1,2,5],[3,2,5],[4,2,5],[1,3,5],[2,3,5],[4,3,5],[1,4,5],[2,4,5],[3,4,5]

計算効率を考慮しなければ,関数式プログラミングは非常によい.今日最も重要な1つの感じ、関数式のプログラミングは比較的にマクロの機能ブロックの実現アルゴリズムを使って、各機能ブロック、例えばmap、foldなど、すべて1つの完全な機能を実現することができて、完全な意義を持って、そのため、構成のコードの品質は比較的に高いです.C言語プログラミングは、基本文が細かすぎるため、木を見て森が見えない状況に陥りやすく、設計の欠陥が発生しやすい.