Functional Programming Using Fsharp个人答案

来源:互联网 发布:全球环境污染数据统计 编辑:程序博客网 时间:2024/04/29 13:09

1

1.1

let g n = n + 4;;

1.2

let h (x, y) = System.Math.Sqrt (x * x + y * y);;

1.3

g 1;;f (1, 2);;

1.4

let rec f = function  | 0 -> 0  | n -> n + f (n-1);;

1.5

let rec fibonacci = function  | 0 -> 0  | 1 -> 1  | n -> fibonacci (n-1) + fibonacci (n-2);;

1.6

let rec sum = function  | (m, 0) -> m  | (m, n) -> m + n + sum(m, n-1);;

1.7

float*int
int
float
(float*int -> float)*(int -> int)

1.8

> let a = 5;;  val a : int = 5  > let f a = a + 1;;  val f : a:int -> int  > let g b = (f b) + a;;  val g : b:int -> int  > f 3;;  val it : int = 4  > g 3;;  val it : int = 9  

2

2.1

let f n = (n % 2 = 0) &&  (n % 3 = 0) && (n % 5 <> 0);;f 24;;f 27;;f 29;;f 30;;

2.2

let rec pow = function  | (_, 0) -> ""  | (s, n) -> s + pow(s, n-1);;

2.3

let isIthString (str, i, ch) =   if String.length str <= i   then false   else str.[i] = ch;;

2.4

let rec occFromIth (str, i, ch) =   if String.length str <= i  then 0  else if str.[i] = ch       then i       else occFromIth (str, i+1, ch);;

2.5

let rec occInString (str, i, ch, acc) =  if String.length str <= i  then acc  else if str.[i] = ch       then occInString (str, i+1, ch, acc+1)       else occInString (str, i+1, ch, acc);;let occInString (str, ch) = occInString (str, 0, ch, 0);;

2.6

let notDivisible(d, n) = if n % d = 0 then false else true;;

2.7

let rec test (a, b, c) = if a > b then true else notDivisible(a, c) && test(a+1, b, c);; let prime n = if n = 1 then true else test (2, n, n);;let nextPrime n = if prime (n+1) then (n+1) else nextPrime (n+1);;

2.8

let rec bin = function  | (n, 0) -> 1  | (n, k) -> if n = k then 1 else bin (n-1, k-1) + bin(n-1, k);;

2.9

 1. int*int -> int 2. when x = 0 in f(x, y) 3. f(2, 3) = f(1, 6) = f(0, 12) = 12 4. f(x, y) = x! * y

2.10

 5. bool*int -> int 6. 3.type error?

2.11

let Vat (n:int) x = x * (1.0 +(float n) / 100.0);;let unVat (n:int) x = x / (1.0 +(float n) / 100.0);;

2.12

let rec minRec (f:int->int) n = if f n = 0  then n else f (n+1);;let min (f:int->int) : int = minRec f 0;;

2.13

let curry f x y = f (x, y);;let uncurry f (x, y) = f x y;;

3

3.1

Tuple

let timeTuple = function  | (a, b, "AM") -> a * 60 + b  | (a, b, "PM") -> (a + 12) * 60 + b  | _            -> failwith "Neither AM or PM";;let beforeTuple a b = timeTuple a < timeTuple b;;

Record

type Time = {hours:int; mimutes:int; f:string};;let timeRecord {hours = a; mimutes = b; f = c } =   match c with  | "AM" -> a * 60 + b  | "PM" -> (a + 12) * 60 + b  | _    -> failwith "Neither AM or PM";;let beforeRecord a b = timeRecord a < timeRecord b;;

3.2

Tuple

let currencyTupleToValue (pounds, shaillings, pence) =  ((pounds * 20) + shaillings) * 12 + pence;;let currencyValueToTuple value =  let pence = value % 12  let shaillings = (value / 12) % 20  let pounds = value / (12 * 20)  (pounds, shaillings, pence);;let (.+.) a b = currencyValueToTuple (currencyTupleToValue a + currencyTupleToValue b);;let (.-.) a b = currencyValueToTuple (currencyTupleToValue a - currencyTupleToValue b);;

Record

type currency = {pounds:int;shaillings:int;pence:int};;let currencyRecordToValue {pounds = a;shaillings = b;pence = c} =  ((a * 20) + b) * 12 + c;;let currencyValueToRecord value =  let c = value % 12  let b = (value / 12) % 20  let a = value / (12 * 20)  {pounds = a; shaillings = b; pence = c};;let (.+.) a b = currencyValueToRecord (currencyRecordToValue a + currencyRecordToValue b);;let (.-.) a b = currencyValueToRecord (currencyRecordToValue a - currencyRecordToValue b);;

3.3

let (.+.) (a:float, b) (c, d) = (a+c, b+d);;let (.*.) (a:float, b) (c, d) = (ac-bd, bc+ad);;let (.-.) (a:float, b) (c, d) = (a-c, b-d);;let inverseComplex (a:float, b) = (a/(a * a + b * b), - b/(a * a + b * b));; let (./.) a b = if (a == 0.0 && b == 0.0) then failwith "both a and b are 0." else a .*. (inverseComplex b);;

3.5

type Solution = | TwoRoot of float * float                | OneRoot of float                | NoRoot;;let solve(a, b, c) =  let delta = b * b - 4 * a * c  match delta with  | 0            -> OneRoot of (-b) / (2 * a)  | t when t > 0 -> TwoRoot of ((-b + sqrt delta)/(2 * a), (-b - sqrt delta)/(2 * a))  | _            -> NoRoot;;

3.6

type AMPM = AM | PM;;let timeTuple = function  | (a, b, AM) -> a * 60 + b  | (a, b, PM) -> (a + 12) * 60 + b;;

4

4.1

let upto n =   let rec uptoRec =    function    | (0, x) -> x    | (n, x) -> uptoRec ((n-1), n::x)  uptoRec(n, []);;

4.2

let rec downto1 n =  match n with  | 0 -> []  | n -> n::downto1 (n-1);;

4.3

let evenN n =   let rec evenNRec =    function    | (0, x) -> x    | (n, x) -> evenNRec ((n-1), (n*2)::x)  evenNRec(n, []);;

4.4

let rec altsum = function  | [] -> 0  | x::xs -> if xs = [] then x  else x - List.head xs + altsum (List.tail xs);;

4.5

let rmodd x =   let rec rmRec n y =    if n = 0    then if y = []         then []         else List.head y::rmRec 1 (List.tail y)    else if y = []         then []         else rmRec 0 (List.tail y)      rmRec 0 x;;

4.6

let rmeven x =   let rec rmRec n y =    if n = 0    then if y = []         then []         else List.head y::rmRec 1 (List.tail y)    else if y = []         then []         else rmRec 0 (List.tail y)      rmRec 1 x;;

4.7

let rec occur x xs =   if xs = []  then 0  else if List.head xs = x       then 1 + occur x (List.tail xs)       else occur x (List.tail xs);;

Fuck!!!不知道4.5为什么模式匹配没成功

let rex occur x xs =  match xs with  | [] -> 0  | y::ys -> if y = x             then 1 + occur x ys             else occur x ys;;

4.8

let split x =  let rec splitRec (n, a, b, c) =    match a with    | [] -> (b, c)    | y::ys -> if n = 0                then splitRec (1, ys, b@[y], c)                else splitRec (0, ys, b, c@[y])  splitRec (0, x, [], []);;

4.9

let rec zip = function  | (x::xs, y::ys) -> (x, y)::zip(xs, ys)  | ([], []) -> []  | ([], _) | (_, []) -> failwith "Not Equal";;

4.10

let rec prefix = function  | (x::xs, y::ys) -> if x = y then true && prefix (xs, ys) else false  | ([], _)        -> true  | (_, [])        -> false;;

4.11

let rec count = function  | (x::xs, y) -> if x = y then 1 + count(xs, y) else count(xs, y)  | ([], y)    -> 0;;let rec insert = function  | (x::xs, y) -> if y > x then x::y::xs else x::insert(xs, y)  | ([], y)    -> [y];;let rec intersect = function  | (x::xs, y::ys) when x < y -> intersect(xs, y::ys)  | (x::xs, y::ys) when x > y -> intersect(x::xs, ys)  | (x::xs, y::ys) -> x::intersect(xs, ys)   | ([], _)        -> []  | (_, [])        -> [];;let rec plus = function  | (x::xs, y::ys) when x < y -> x::plus(xs, y::ys)  | (x::xs, y::ys) when x > y -> y::plus(x::xs, ys)  | (x::xs, y::ys) -> x::y::plus(xs, ys)   | ([], y)        -> y  | (x, [])        -> x;;let rec minus = function  | (x::xs, y::ys) when x < y -> x::minus(xs, y::ys)  | (x::xs, y::ys) when x > y -> minus(x::xs, ys)  | (x::xs, y::ys) -> minus(xs, ys)  | ([], _) -> []  | (x, []) -> x;;

4.12

let rec sum = function  | (p, x::xs) -> if (p x) then x + sum(p, xs) else sum(p, xs)  | (p, []) -> 0;;sum((fun n -> n > 0), [-1;1]);;

4.13

let smallest x =  let rec smallestRec = function    | (x, y::ys) -> if x < y then smallestRec(x, ys) else smallest(y, ys)    | (x, [])    -> x  smallestRec(List.head x, x);;let rec delete = function  | (a, x::xs) when a = x -> xs  | (a, x::xs) -> x::delete(a, xs)  | (a, [])    -> [];;let sort = function  | [] -> []  | x  -> (smallest x)::delete(smallest x, x);;

4.15

let revrev = function  let rec rev = function    | x::xs -> xs@[x]    | []    -> []  | x::xs -> xs@[rev x]  | [] -> [];;

4.16

f:int*int list -> int list
g:(a’* a’) list -> (a’ * a’) list
h: a’ list -> a’ list
1.int list
2.(a’ * a’) list
3.a’ list

4.17

a’ list -> a’ list

4.19

let rec areNb m c1 c2 =  match m with  | [] -> false  | (a, b)::mm when ((a=c1 && b=c2) || (a=c2 && b=c1)) -> true  | (a, b)::mm -> areNb mm  c1  c2;;

5

5.1

let filter p x = List.foldBack (fun x y -> if (p x) then x::y else y) x [];;

5.2

let revrev a =   let rev = List.fold (fun x y -> y::x) []  List.fold (fun x y -> (rev y)::x) [] a;;       revrev [[1;2];[3;4;5]];;

5.3

let sum p x = List.fold (fun x y -> if p y then x + y else x) 0 x;;

5.4

let downto1 f n e =   if n > 0  then List.foldBack (fun x y -> f x y) [1..(n-1)]  (f n e)  else e;;let factorial n = downto1 (fun x y -> x * y) n 1;;let build g n = downto1  (fun x y -> (g x)::y) n [];;factorial 10;;build id 10;;

5.7

立即求值就是麻烦啊,在每一次let绑定时就进行求值

let rec bin = function  | (n, 0) -> 1  | (n, k) -> if n = k then 1 else bin (n-1, k-1) + bin(n-1, k);;let allSubsets n k =   if n <= k   then failwith "n <= k"   else    let array = [1..n]    let num = bin(n, k)    let rec subset n = function      | x::xs when n > 0 -> x::(subset (n-1) xs)      | _                -> []    let rec subsets n x =      let headList = List.head x      let tailList = List.tail x      if n <= 0      then []      else (subset k x)::(subsets (n-1) (tailList@[headList]))     subsets num array;;allSubsets 3 2;;allSubsets 3 1;;allSubsets 3 0;;

6

6.2

type Fexpr = | Const of float             | X             | Add of Fexpr * Fexpr             | Sub of Fexpr * Fexpr             | Mul of Fexpr * Fexpr             | Div of Fexpr * Fexpr             | Sin of Fexpr             | Cos of Fexpr             | Log of Fexpr             | Exp of Fexpr;;let rec RPN = function  | Const x -> string x + " "   | X  -> "x "  | Add(fe1, fe2) -> (RPN fe1) + (RPN fe2) + "+ "  | Sub(fe1, fe2) -> (RPN fe1) + (RPN fe2) + "- "  | Mul(fe1, fe2) -> (RPN fe1) + (RPN fe2) + "* "  | Div(fe1, fe2) -> (RPN fe1) + (RPN fe2) + "/ "  | Sin fe -> RPN fe + "sin "  | Cos fe -> RPN fe + "cos "  | Log fe -> RPN fe + "log "  | Exp fe -> RPN fe + "exp ";;RPN (Sin(Mul(X, X)));;

6.4

type BinTree<'a, 'b> =   | Leaf of 'a  | Node of BinTree<'a, 'b> * 'b * BinTree<'a, 'b>;;let leafVals x =   let rec leafValsRec = function    | Leaf a -> [a]    | Node (a, _, b) -> (leafValsRec a) @ (leafValsRec b)   Set.oflist (leafValsRec x);;let nodeVals x =   let rec nodeValsRec = function    | Leaf a -> []    | Node (a, b, c) -> (nodeValsRec a) @ [b] @ (nodeValsREc c)  Set.oflist (nodeValsRec x);;let vals x = (leafVals x, nodeVals x);;

6.5

type AncTree =   | Unspec  | Info of AncTree * string * AncTree;;let rec maleAnc =   let rec FAnc = function    | Unspec -> []    | Info (a, x, b) -> x::(FAnc a)@(maleAnc b)  function  | Unspec -> []  | Info (a, x, b) -> (FAnc a)@(maleAnc b);;let rec femaleAnc =  let rec MAnc = function    | Unspec -> []    | Info (a, x, b) -> x::(femaleAnc a)@(MAnc b)  function  | Unspec -> []  | Info (a, x, b) -> (female a)@(MAnc b);;

6.6

type BinTree<'a when 'a: comparison> =  | Leaf  | Node of BinTree<'a> * 'a * BinTree<'a>;;let rec add x t  =   match t with  | Leaf                     -> Node (Leaf, x, Leaf)  | Node(tl, a, tr) when x<a -> Node (add x tl, a,tr)  | Node(tl, a, tr) when x>a -> Node (tl, a, add x tr)  | _                        -> t;;let rec delete x t =   let rec conjunction x = fucntion    | Leaf -> tl    | Node (tl, a,tr) -> Node (conjunction x tl, a, tr)  match t with  | Leaf                      -> Leaf  | Node (tl, a, tr) when x<a -> Node (delete x tl, a, tr)  | Node (tl, a, tr) when x>a -> Node (tl, a, delete x tr)  | Node (Leaf, a, Leaf)      -> Leaf  | Node (Leaf, a, tr)        -> tr  | Node (tl, a, Leaf)        -> tl  | Node (tl, a, tr)          -> conjunction(tl, tr);;

6.7

type PropositionExp =  | Proposition of string  | Negation of Propostion  | Conjunction of Proposition * Proposition  | Disjunction of Proposition * Proposition

6.8

type Fexpr = | Const of float             | X             | Add of Fexpr * Fexpr             | Sub of Fexpr * Fexpr             | Mul of Fexpr * Fexpr             | Div of Fexpr * Fexpr             | Sin of Fexpr             | Cos of Fexpr             | Log of Fexpr             | Exp of Fexpr;;type Stack = int List;;type Instruction = | ADD | SUB | MUL | DIV | SIN                   | COS | LOG | EXP | PUSH of float;;let intpInstr a b =  match (a, b) with  | (x::xs::xss, ADD)  -> (xs + x)::xss  | (x::xs::xss, SUB)  -> (xs - x)::xss  | (x::xs::xss, MUL)  -> (xs * x)::xss  | (x::xs::xss, DIV)  -> (xs / x)::xss  | (x::xs, SIN)       -> (System.Math.Sin x)::xs  | (x::xs, COS)       -> (System.Math.Cos x)::xs  | (x::xs, LOG)       -> (System.Math.Log x)::xs  | (x::xs, EXP)       -> (System.Math.Exp x)::xs  | (x, PUSH a)        -> a::x  | _                  -> failwith "Matching Fail";;let intpProg = List.fold intpInstr [];;let trans (fe, x) =  let rec transRec(fe, stack) =    match fe with    | Const z -> PUSH z::stack    | X  -> PUSH x::stack    | Add(fe1, fe2) -> transRec(fe1,transRec(fe2, ADD::stack))    | Sub(fe1, fe2) -> transRec(fe1,transRec(fe2, SUB::stack))    | Mul(fe1, fe2) -> transRec(fe1,transRec(fe2, MUL::stack))    | Div(fe1, fe2) -> transRec(fe1,transRec(fe2, DIV::stack))    | Sin fe -> transRec(fe, SIN::stack)    | Cos fe -> transRec(fe, COS::stack)    | Log fe -> transRec(fe, LOG::stack)    | Exp fe -> transRec(fe, EXP::stack)  transRec(fe, []);;let ins = trans(Sin(Sub(Const 2.0, X)), 1.0);;intpProg ins;;

6.9

type Name = string;;type Incoming = float;;type Department = Depart of Name * Incoming * Department list;;let rec fun3 (Depart(a, b, c)) = (a, b)::(List.collect fun3 c);;let fun3Fold =   let rec fun3FoldAux f e (Depart(a, b, c)) =    List.fold (fun3FoldAux f) (f e (a,b)) c  fun3FoldAux (fun a x -> x::a) [];;//val fun3FoldAux : f:('a -> Name * Incoming -> 'a) -> e:'a -> Department -> 'a//val fun3Fold : (Department -> (Name * Incoming) list)//fun3FoldAux (fun a x -> x::a);;//val it : ((Name * Incoming) list -> Department -> (Name * Incoming) list)let fun4 x = List.sum (List.map snd (fun3 x));;//let fun4 = List.sum << List.map snd << fun3;;let myfst (Depart(a,_,_)) = a;;let fun5 = List.map (fun x -> (myfst x, fun4 x)) ;;let format (Depart(a, b, c)) = string a + "    " + string b;;

6.10

type ExprTree =   | Const of int  | Ident of string   | Minus of ExprTree  | Sum   of ExprTree * ExprTree  | Diff  of ExprTree * ExprTree  | Prod  of ExprTree * ExprTree  | Let   of string * ExprTree * ExprTree  | IFTE  of BoolExp * ExprTree * ExprTreeand BoolExp =  | True  | False  | Negation    of BoolExp  | Conjunction of BoolExp * BoolExp  | Disjunction of BoolExp * BoolExp  | LessThan of ExprTree * ExprTree  | MoreThan of ExprTree * ExprTree  | Equal of ExprTree * ExprTree  | LessThanEqual of ExprTree * ExprTree  | MoreThanEqual of ExprTree * ExprTree;;let rec eval t env =  match t with  | Const n      -> n  | Ident s      -> Map.find s env  | Minus t      -> - (eval t env)  | Sum(t1,t2)   -> eval t1 env + eval t2 env  | Diff(t1,t2)  -> eval t1 env - eval t2 env  | Prod(t1,t2)  -> eval t1 env * eval t2 env  | Let(s,t1,t2) -> let v1 = eval t1 env                    let env1 = Map.add s v1 env                    eval t2 env1  | IFTE (a,b,c) -> if boolValue a env then eval b env else eval c envand  boolValue t env =  match t with  | True                 -> true  | False                -> false  | Negation x           -> not (boolValue x env)  | Conjunction (x, y)   -> (boolValue x env) && (boolValue y env)  | Disjunction (x, y)   -> (boolValue x env) || (boolValue y env)  | LessThan (x, y)      -> (eval x env)  < (eval y env)  | MoreThan (x, y)      -> (eval x env)  > (eval y env)  | Equal (x, y)         -> (eval x env)  = (eval y env)  | LessThanEqual (x, y) -> (eval x env) <= (eval y env)  | MoreThanEqual (x, y) -> (eval x env) >= (eval y env);;

6.11

let t1 = Node(1,[t2; t3; t4]);;let rec depthFirstFold f e (Node(x,ts)) =  List.fold (depthFirstFold f) (f e x) ts;;>>depthFirstFold (fun a x -> x::a) [] t1->List.fold (depthFirstFold f) [1] [t2;t3;t4]->List.fold (depthFirstFold f) (depthFirstFold f [1] t2) [t3;t4]->List.fold (depthFirstFold f) (depthFirstFold f [1] Node(2,[t5])) [t3;t4]->List.fold (depthFirstFold f) (List.fold (depthFirstFold f) [2;1] [t5]) [t3;t4]->List.fold (depthFirstFold f) (List.fold (depthFirstFold f [2;1] t5) []) [t3;t4]->List.fold (depthFirstFold f) (List.fold (depthFirstFold f [2;1] Node(5,[])) []) [t3;t4]->List.fold (depthFirstFold f) (List.fold (depthFirstFold f) (List.fold (depthFirstFold f) [5;2;1] [])) []) [t3;t4]->List.fold (depthFirstFold f) (List.fold (depthFirstFold f) [5;2;1] []) [t3;t4]->List.fold (depthFirstFold f) (depthFirstFold f [5;2;1] t3) [t4]->List.fold (depthFirstFold f) (depthFirstFold f [5;2;1] Node(3,[])) [t4]->List.fold (depthFirstFold f) (List.fold (depthFirstFold f) [3;5;2;1] []) [t4]->List.fold (depthFirstFold f) [3;5;2;1] [t4]->List.fold (depthFirstFold f) (depthFirstFold f [3;5;4;1] t4) []->List.fold (depthFirstFold f) (depthFirstFold f [3;5;4;1] Node(4,[])) []->List.fold (depthFirstFold f) (List.fold (depthFirstFold f) [4;3;5;2;1] []) []->List.fold (depthFirstFold f) [4;3;5;2;1] []->[4;3;5;2;1]

7

7.1

fs

module Vectortype Vector = { x: float, y: float}let (~-.) ({x, y} = {-x, -y}let (+.)  ({x1, y1}) ({x2, y2}) = {x1+x2, y1+y2}let (-.)  ({x1, y1}) ({x2, y2}) = {x1-x2, y1-y2}let (*.)  a ({x, y})            = {a*x, a*y}let (&.)  ({x1, y1}) ({x2, y2}) = x1 * x2 + y1 * y2let norm  ({x, y})              = sqrt(x*x + y*y)let make  (x, y)                = {x, y}let coord ({x,y})               = (x, y)

8

8.1

Environment Store
//let mutable x = 1
x |-> loc1 loc1:1
//let mutable y = (x, 2)
y |-> loc2 loc2:(1, 2)
//let z = y
z |-> 1
//x.a <- 7
loc1:7

8.3

Environment Store
//let x = {a = 1}
x |-> {a |-> loc1} loc1:1
//let y = {b = x.a; x = x}
y |-> {b |-> loc2, loc2:1
c |-> loc3} loc3:{a |-> loc1}
//x.a <- 3
loc1:3

8.5

let gcd a b =  let mutable m = a  let mutable n = b  while m <> 0 do    let t = n % m    n <- m    m <- t  n;;gcd 12 22;;

8.6

let fibonacci n =  if n <= 1  then n  else let mutable i = 1       let mutable x1 = 0       let mutable x2 = 1       let mutable temp = Unchecked.defaultof<int>       while i < n do         temp <- x1 + x2         x1 <- x2         x2 <- temp         i <- i + 1       temp;;fibonacci 4;;

8.9

open System.Collections.Generictype ListTree<'a> = Node of 'a * (ListTree<'a> list);;let depthFirst ltr =  let mutable result = []  let remains = Queue<ListTree<'a>>()  remains.Enqueue ltr  while (remains.Count <> 0) do    let (Node (x, tl)) = remains.Dequeue()    List.iter (remains.Enqueue) tl    result <- x::result  List.rev result;;let depthFirstFold f e tl =  let mutable result = e  let remains = Queue<ListTree<'a>>()  remains.Enqueue tl  while (remains.Count <> 0) do    let (Node (x, tl)) = remains.Dequeue()    List.iter (remains.Enqueue) tl    result <- f e x  result;;

9

9.2

let rec gcd (m, n) =   if (m <> 0)  then gcd(n % m, m)  else n;;let f(n, m) = (n % m, m)let p(n, m) = m <> 0let h(n, m) = n

9.3

let sum(m, n) =   let sumRec(m, n, acc) =    if n = 0    then acc    else sumRec(m, n-1, m + n + acc)  sumRec(m, n, 0);;

9.4

let length x =  let rec lengthRec(x, acc) =     match x with    | []    -> acc    | x::xs -> length(xs, acc + 1)  length(x, 0);;

9.6

let fact_CPS n =  let rec factRec n c =    if n = 0    then c 1    else factRec (n-1) (fun x -> c(n * x))  factRec n id;;fact_CPS 3;;

9.7

let rec fibA n n1 n2 =   if n <= 1  then n2  else fibA (n-1) n2 (n1+n2);;fibA 5 0 1;;let rec fibC n c =  if n <= 1  then c n  else fibC (n-1) (fun n1 -> fibC (n-2) (fun n2 -> c (n1 + n2)));;fibC 5 id;;

9.8

type BinTree<'a> =   | Leaf  | Node of BinTree<'a> * 'a * BinTree<'a>;;let rec countA acc t =  match t with  | Leaf -> acc  | Node(tl, a, tr) ->    let ex = countA (acc+1) tr    countA ex tl;;

9.10

let rec bigListC n c=  if n = 0 then c []  else bigListC (n-1) (fun res -> c(1::res));;let rec bigListK n k=  if n = 0 then k []  else bigListK (n-1) (fun res -> 1::k(res));;bigListC 130000 id;;bigListK 130000 id;;

9.12

let rec preOrderC t c =  match t with  | Leaf -> c []  | Node(tl, a, tr) -> preOrderC tl (fun v1 -> preOrderC t2 (fun v2 -> c (a::(v1@v2))));;

11

11.1

let nat = Seq.initInfinite (fun i -> i * 2 + 1);;Seq.item 5 nat;;

11.2

let rec fact = function  | 0 -> 1  | n -> n * fact (n-1);;let nat = Seq.initInfinite (fun i -> fact i);;

11.3

let cons x sq = Seq.append (Seq.singleton x) sq;;let rec factor sq =   Seq.delay (fun () ->                 let p = Seq.item 0 sq                 let x = Seq.item 1 sq                 if x <= 1                 then cons 1 (factor (Seq.skip 1 sq))                 else cons (p * x) (factor (cons (p*x) (Seq.skip 2 sq))));;factor (Seq.initInfinite(fun i -> if i <= 1 then 0 else i-1));;
0 0
原创粉丝点击