Advertisement
Guest User

Untitled

a guest
Mar 21st, 2017
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 2.65 KB | None | 0 0
  1. // 4.2
  2. let rec sumI a m = function
  3.      0 -> a
  4.    | n -> sumI (a+m+n) m (n-1)
  5.  
  6. // Helper for simple calls to iterative function
  7. let sum m = sumI m m
  8.  
  9. // 4.3
  10. let rec listlenI a = function
  11.      [] -> a
  12.    | x::xs -> listlenI (a+1) xs
  13.  
  14. // Helper
  15. let listlen l = listlenI 0 l
  16.  
  17. // 5.4
  18. let rec factA = function
  19.     | (0, m) -> m
  20.     | (n, m) -> factA(n-1, n*m)
  21.  
  22. let rec factC c = function
  23.     | 0 -> c 1
  24.     | n -> factC (fun inp -> c(n*inp)) (n-1)
  25.  
  26. // Timing results (for n=10^7):
  27. // factA -> 0.088s
  28. // factB -> 1.008s
  29. // disclaimer: obviously I didn't get any meaningful results from these runs
  30.  
  31. // 5.5
  32. let fib n =
  33.     let mutable a = 1
  34.     let mutable b = 1
  35.     let mutable rn = n-2
  36.     while rn > 0 do
  37.         (
  38.         let tmp = b
  39.         b <- a+b
  40.         a <- tmp
  41.         rn <- rn - 1
  42.         )
  43.     b
  44.  
  45. // 4.6
  46. // iterative
  47. let rec fibA n1 n2 = function
  48.       2 -> n2
  49.     | n -> fibA n2 (n1+n2) (n-1)
  50.  
  51. // continuation
  52. let rec fibC n c = match n with
  53.       1 -> c 1
  54.     | 2 -> c 1
  55.     | n -> fibC (n-2) (fun v -> fibC(n-1) (fun v2 -> c(v+v2)))
  56.  
  57. // Timing results (using n=40):
  58. // fibA -> 0s
  59. // fibC -> 6.031s
  60. // while -> 0s
  61.  
  62. type BinTree<'a> = | Leaf
  63.                   | Node of BinTree<'a> * 'a * BinTree<'a>
  64.  
  65. // 4.7
  66. let rec countA a t =
  67.     match t with
  68.     | Leaf              -> a
  69.     | Node(tl, n, tr)   -> countA (a+(countA (1) tr)) tl
  70.  
  71. // 4.8
  72. let rec countAC t a c =
  73.     match t with
  74.     | Leaf              -> c (a)
  75.     | Node(tl, n, tr)   -> countAC tl (1) (fun v -> countAC tr (a+v) c)
  76.  
  77. // 4.9?
  78. let rec bigListK n k =
  79.     if n=0 then k []
  80.     else bigListK (n-1) (fun res -> 1::k(res))
  81.  
  82. // 4.10
  83. let rec leftTree s a = function
  84.     | 0 -> a
  85.     | n -> leftTree s (Node(a, s-n, Leaf)) (n-1)
  86.  
  87. let rec rightTree s a = function
  88.     | 0 -> a
  89.     | n -> rightTree s (Node(Leaf, s-n, a)) (n-1)
  90.  
  91. // From the book
  92. let rec countC t c =
  93.     match t with
  94.     | Leaf -> c 0
  95.     | Node(tl,n,tr) ->
  96.         countC tl (fun vl -> countC tr (fun vr -> c(vl+vr+1)))
  97.  
  98. let rec count = function
  99.     | Leaf -> 0
  100.     | Node(tl,n,tr) -> count tl + count tr + 1
  101.  
  102. // count  (leftTree)  -> OutOfMemoryException at 10^5 nodes
  103. // countA (leftTree)  -> OutOfMemoryException at 10^8 nodes
  104. // count  (rightTree) -> OutOfMemoryException at 10^5 nodes
  105. // countA (rightTree) -> OutOfMemoryException at 10^5 nodes
  106.  
  107. // Timing: n=10^7
  108. // countAC (leftTree)  -> 2.274s
  109. // countAC (rightTree) -> 1.423s
  110. // countC  (leftTree)  -> 2.719s
  111. // countC  (rightTree) -> 2.924s
  112.  
  113. // 4.11
  114. let odd = Seq.initInfinite (fun i -> i*2+1)
  115.  
  116. // 4.12
  117. let rec fact = seq {
  118.     yield 1
  119.     yield! Seq.map2 (*) fact (Seq.initInfinite (fun i -> i+1))
  120. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement