- 176 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 23:40:08 ]
- arraySwap:: !*{#Int} !Int !Int -> *{#Int}
arrayReverse ar a z :== arrayReverse` ar a (z-1) // arrayReverse 概略 araySwap inline化 arrayCopyn ar ar2 n :== arrayCopyn` ar ar2 (n-1) where arrayCopyn`:: !*{#Int} !*{#Int} !Int-> (*{#Int},*{#Int}) arrayCopyn` ar ar2 -1 = (ar,ar2) arrayCopyn` ar ar2 i #! (v_i,ar) = ar![i] = arrayCopyn` ar {ar2 & [i]=v_i} (i-1) successorPermutaion n perm :== successor` (n-2) perm where successor`:: !Int !*{#Int} -> (Maybe *{#Int}) successor` i perm | i < 0= Nothing #! (plus,perm) = perm![i+1] #! (val,perm) = perm![i] | plus > val#! (ith,perm) = perm![i] #! (j, perm) = lp2 (n - 1) ith perm #!perm = arrayReverse (arraySwap perm i j) (i + 1) n = Just perm = successor` (i-1) perm lp2:: !Int !Int !*{#Int} -> (Int, *{#Int}) lp2 j ith perm#! (val_j , perm) = perm![j] | (val_j > ith) = (j,perm) = lp2 (j-1) ith perm //これを動かしたい人はいろいろ組合わせて下さい。 // *組*を作成しなければ、無駄なメモリ消費量を抑えられるはず。
|

|