Commit 8e4d8972 authored by Taddeüs Kroes's avatar Taddeüs Kroes

Merged conficts.

parents e73a625e 5b2ec064
...@@ -2,6 +2,8 @@ open List ...@@ -2,6 +2,8 @@ open List
(* 1 *) (* 1 *)
let rec nth l n = let rec nth l n =
(* Walk through the list recursively, subtracting 1 off n each time and
* matching it with 0 to check of the nth element has been reached yet *)
match l with match l with
| [] -> raise (Failure "list index out of bounds") | [] -> raise (Failure "list index out of bounds")
| h::t -> if n = 0 then h else nth t (n - 1) | h::t -> if n = 0 then h else nth t (n - 1)
...@@ -12,20 +14,27 @@ let heads l = map hd l;; ...@@ -12,20 +14,27 @@ let heads l = map hd l;;
(* 3 *) (* 3 *)
let zip l m = let zip l m =
let rec cut l e = (* Cut off a list l at length e *)
let len = (length l) in let rec cut l e = if e = (length l) then l else cut (rev (tl (rev l))) e in
if e = len then l else cut (rev (tl (rev l))) e (* Get the minimum of two integers *)
in
let min a b = if a > b then b else a in let min a b = if a > b then b else a in
(* Cut off both lists at the length of the shortest list to equal their
* lengths, then use the native 'combine' function *)
let len = min (length l) (length m) in let len = min (length l) (length m) in
List.combine (cut l len) (cut m len) combine (cut l len) (cut m len)
;; ;;
(* 4 *) (* 4 *)
let rec map f l = if length l = 0 then [] else (f (hd l))::(map f (tl l));; let rec map f l =
(* Apply f to the head, then map it to the tail recursively *)
match l with
| [] -> []
| h::t -> f h::map f t
;;
(* 5 *) (* 5 *)
let rec reduce f z l = let rec reduce f z l =
(* Apply f to the head, and the reducement of the tail *)
match l with match l with
| [] -> z | [] -> z
| h::t -> f z (reduce f h t) | h::t -> f z (reduce f h t)
...@@ -33,17 +42,33 @@ let rec reduce f z l = ...@@ -33,17 +42,33 @@ let rec reduce f z l =
(* 6 *) (* 6 *)
let rec isSublist l s = let rec isSublist l s =
match s with (* Check if l starts with s, otherwise chech the tail recursively *)
| [] -> true let rec startsWith l s =
| h::t -> h = (hd l) && isSublist (tl l) t (length s) <= (length l) && match s with
| [] -> true
| h::t -> h = (hd l) && startsWith (tl l) t
in
match l with
| [] -> false
| _::t -> (startsWith l s) || (isSublist t s)
;; ;;
(* 7 *) (* 7 *)
let rec lookup l key = let rec lookup l key =
(* Math key to the first tuple and return the value-side of the tuple if
* matched. Otherwise, lookup in the rest of the tuples *)
match l with match l with
| [] -> raise (Failure "lookup") | [] -> raise (Failure "lookup")
| h::t -> let k, v = h in if k = key then v else lookup t key | h::t -> let k, v = h in if k = key then v else lookup t key
;; ;;
(* Challenge *) (* Challenge *)
let rec coin_permutation l n =
(* Reduce the list using the fact that the the total number of coin
* permutations is equal to the number of permutations given a single coin,
* added to the number of permutations without that coin *)
match l with
| [] -> 0
| h::t -> (if h > n then 0 else 1 + (coin_permutation t (n - h)))
+ (coin_permutation t n)
;;
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment