私はハズケルで考え、コードを学習しています。 「最小の数が勝つ」ゲーム:n人が1とnの間の数字にベットを行い、最小の数字が1つの賭けで勝ちます。可能なすべてのゲームの「最小の数字が勝つ」ゲーム結果を計算する - メモリ不足
私はn = 10と勝者数を数えるベットのすべての可能なシリーズを計算しています。はい、このコードは正確には行いませんが、私のここでのポイントではありませんが、比較的速くメモリが不足している私のコードです。
(追加されたコメント - !申し訳ありません)
import Data.Array
import Data.List
f xs = flip map [1..10] $ flip (:) xs
p 1 = f []
p n = concat $ map f $ p (n-1)
--the above, (p n) generates the list of all possible [a1, a2, ..., an] lists, where ai=1..10
--p 2 = [[1,1],[2,1],[3,1],[4,1],[5,1],...,[10,10]
--my first shot at the countidens function, the functionality stays the same with the other
--countidens2 xs = map (\x->(head x, length x)) $ group $ sort xs
countidens' xs = accumArray (+) 0 (1,10) $ zip xs $ repeat 1
countidens xs = filter ((/=) 0 . snd) $ zip [1..10] $ map ((countidens' xs)!) [1..10]
--counts the number of occurrences of each number (1..10) in a list
--countidens [1,1,1,2,2,3] = (1,3),(2,2),(3,1)]
--(the above, countidens2 is much easier to understand)
numlist n = map (flip (++) ([(0,0)])) $ map countidens $ p n
--maps countidens on the (p n) list, and attaches a dummy (0,0) to the end (this is needed later)
g (x, (y, z)) | (x==y) && (z==1) = True
| (x < y) = True
| (y==0) = True
| otherwise = False
-- filter function for [(a, (a,a)] lists - (a1, (a1, a)) -> Bool
winners n = map fst $ map (head . filter g) $ map (zip [1..]) $ numlist n
-- extracts the number of the first element of (numlist n) that qualifies as g
-- for each element of g (note: these are results of the countidens function, since that was mapped)
-- the dummy (0,0) was needed so there's always one that does
winnernumsarr n = accumArray (+) 0 (1,10) $ flip zip (repeat 1) $ winners n
-- winners n produces a simple list of integers (1..10) that is 10^n long, this (winnernumsarr) accumulates the number of each integer, much like countidens did
-- (but does not produce a fancy output)
main = putStrLn $ show $ winnernumsarr 7 -- aiming for 10! even 8 runs out of memory on my machine
私はこのコードは、私はそれが何をしたいのですが、正確に何をしません知っているが、何より重要なのは、これは私がしました初めてではないということですhaskellで "メモリ不足"問題に遭遇し、私が知っている問題はC++で書かれていて、使用されるメモリはわずかです。
方法が必要ですが、どうすればよいですか?
タイプごとに各機能に注釈を付けて、それが何をするべきかを説明するコメントを付けた場合には役に立ちます –