![]() Princeton University |
Computer Science 441 |
I strongly urge you to complete at least the problems in part A before Thursday's class. That way you can ask questions about anything that doesn't work the way you expect.
If you cannot make it to class on time, please give your homework to someone else or place it in my mailbox in the CS department sometime before the beginning of class.
Part A: Not to be turned in
dup "ab" = ("ab","ab").
list_dup "ab" 3 = ["ab","ab","ab"].
Part B: To be turned in
fun digit_to_char (n:int) = chr (n + ord #"0");Use a let clause to hide the auxiliary functions.
- zip [1,3,5,7] ["a","b","c","de"]; val it = [(1,"a"),(3,"b"),(5,"c"),(7,"de")]: (int * string) listNote: If the vectors don't have the same length, you may decide how you would like the function to behave. If you don't specify any behavior at all you will get a warning from the compiler that you have not taken care of all possible patterns.
- unzip [(1,"a"),(3,"b"),(5,"c"),(7,"de")]; val it = ([1,3,5,7], ["a","b","c","de"]): int list * string list
fun exp base power = if power = 0 then 1 else base * (exp base (power-1));There are more efficient means of exponentiation. First write an ML function that squares an integer, and then using this function, design an ML function fastexp which calculates (basepower) for any power >= 0 by the rule
base0 = 1 basepower = (base(power/2))2 if m is even basepower = base * (base(power-1)) if m is oddIt is easy to blow this optimization and not save any multiplications. Prove the program you implemented is indeed faster than the original by comparing the number of multiplications that must be done for exponent m in the first and second algorithms. (Hint it is easiest to calculate the number of multiplications if the exponent, power, is of the form 2k for the second algorithm. Give the answer for exponents of this form and then try to give an upper bound for the others. Also recall that ML is call-by-value. That is, the argument to a function is evaluated before the call.)
function exp(base, power: integer): integer; var ans:integer begin ans:= 1; while power > 0 do if odd(power) then begin ans := ans*base; power:= power- 1 end else begin base := base * base; power := power div 2 end; exp := ans end;Please mimic the translation given in class to convert this Pascal program to ML. (Note you will obtain a different - and slightly more efficient - version of the program than the natural recursive solution in part a.)
datatype 'a tree = Leaf of 'a | InternalNode of ('a tree) * ('a tree)