Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- fun r [] = []
- | r(x :: xs) = r xs @ [x];
- fun prod(n, 0) = 0
- | prod(n, m) = prod(n, m-1) + n;
- fun fastPow(b, 0) = 1
- | fastPow(b, k) =
- if k mod 2 = 0 then
- fastPow(b * b, k div 2)
- else
- fastPow(b * b, (k - 1) div 2) * b
- fun prodAccum(0, n, a) = a
- | prodAccum(m, n, a) = prodAccum(m - 1, n, n + a);
- fun min(NONE, NONE) = NONE
- | min(NONE, SOME b) = SOME b
- | min(SOME a, NONE) = SOME a
- | min(SOME a, SOME b) = if a < b then SOME a else SOME b;
- fun optionalAdd(NONE, NONE) = NONE
- | optionalAdd(NONE, b) = NONE
- | optionalAdd(a, NONE) = NONE
- | optionalAdd(SOME a, SOME b) = SOME(a + b);
- fun minChange(0, ds) = SOME 0
- | minChange(a, []) = NONE
- | minChange(a, dds as d :: ds) =
- if d > a then
- minChange(a, ds)
- else
- min(optionalAdd(SOME (1), minChange(a - d, dds)), minChange(a, ds));
- fun greedyMinChange(0, ds) = SOME 0
- | greedyMinChange(a, []) = NONE
- | greedyMinChange(a, d :: ds) =
- if d > a then
- greedyMinChange(a, ds)
- else
- let
- val q = a div d
- val r = a mod d
- in
- optionalAdd(SOME (q), greedyMinChange(r, ds))
- end;
- r([1, 2, 3])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement