純粋関数型言語Concurent Clean
■ このスレッドは過去ログ倉庫に格納されています
0176デフォルトの名無しさん
2005/10/02(日) 23:40:08arrayReverse 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
//これを動かしたい人はいろいろ組合わせて下さい。
// *組*を作成しなければ、無駄なメモリ消費量を抑えられるはず。
■ このスレッドは過去ログ倉庫に格納されています