Advertisement
Guest User

Untitled

a guest
Aug 30th, 2019
186
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. fun r [] = []
  2.     | r(x :: xs) = r xs @ [x];
  3.  
  4. fun prod(n, 0) = 0
  5.     | prod(n, m) = prod(n, m-1) + n;
  6.  
  7. fun fastPow(b, 0) = 1
  8.     | fastPow(b, k) =
  9.         if k mod 2 = 0 then
  10.             fastPow(b * b, k div 2)
  11.         else
  12.             fastPow(b * b, (k - 1) div 2) * b
  13.  
  14. fun prodAccum(0, n, a) = a
  15.     | prodAccum(m, n, a) = prodAccum(m - 1, n, n + a);
  16.  
  17. fun min(NONE, NONE) = NONE
  18.     | min(NONE, SOME b) = SOME b
  19.     | min(SOME a, NONE) = SOME a
  20.     | min(SOME a, SOME b) = if a < b then SOME a else SOME b;
  21.  
  22. fun optionalAdd(NONE, NONE) = NONE
  23.     | optionalAdd(NONE, b) = NONE
  24.     | optionalAdd(a, NONE) = NONE
  25.     | optionalAdd(SOME a, SOME b) = SOME(a + b);
  26.  
  27. fun minChange(0, ds) = SOME 0
  28.     | minChange(a, []) = NONE
  29.     | minChange(a, dds as d :: ds) =
  30.         if d > a then
  31.             minChange(a, ds)
  32.         else
  33.             min(optionalAdd(SOME (1), minChange(a - d, dds)), minChange(a, ds));
  34.  
  35. fun greedyMinChange(0, ds) = SOME 0
  36.     | greedyMinChange(a, []) = NONE
  37.     | greedyMinChange(a, d :: ds) =
  38.         if d > a then
  39.             greedyMinChange(a, ds)
  40.         else
  41.             let
  42.                 val q = a div d
  43.                 val r = a mod d
  44.             in
  45.                 optionalAdd(SOME (q), greedyMinChange(r, ds))
  46.             end;
  47.  
  48. r([1, 2, 3])
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement