Created
April 23, 2013 11:26
-
-
Save smies/5442827 to your computer and use it in GitHub Desktop.
From Expert F# 3.0
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
type Tree = | |
| Node of string * Tree * Tree | |
| Tip of string | |
let rec sizeNotTailRecursive tree = | |
match tree with | |
| Tip _ -> 1 | |
| Node(_, treeLeft, treeRight) -> | |
sizeNotTailRecursive treeLeft + sizeNotTailRecursive treeRight | |
let rec mkBigUnbalancedTree n tree = | |
if n = 0 then tree | |
else Node("node", Tip("tip"), mkBigUnbalancedTree (n - 1) tree) | |
let tree1 = Tip("tip") | |
let tree2 = mkBigUnbalancedTree 15000 tree1 | |
let tree3 = mkBigUnbalancedTree 15000 tree2 | |
let tree4 = mkBigUnbalancedTree 15000 tree3 | |
let tree5 = mkBigUnbalancedTree 15000 tree4 | |
let tree6 = mkBigUnbalancedTree 15000 tree5 | |
let rec sizeAcc acc tree = | |
match tree with | |
| Tip _ -> 1 + acc | |
| Node(_, treeLeft, treeRight) -> | |
let acc = sizeAcc acc treeLeft | |
sizeAcc acc treeRight | |
let sizeA tree = sizeAcc 0 tree | |
let rec sizeCont tree cont = | |
match tree with | |
| Tip _ -> cont 1 | |
| Node(_, treeLeft, treeRight) -> | |
sizeCont treeLeft (fun leftSize -> | |
sizeCont treeRight (fun rightSize -> | |
cont (leftSize + rightSize))) | |
let sizeC tree = sizeCont tree (fun x -> x) | |
let rec sizeContAcc acc tree cont = | |
match tree with | |
| Tip _ -> cont (1 + acc) | |
| Node (_, treeLeft, treeRight) -> | |
sizeContAcc acc treeLeft (fun accLeftSize -> | |
sizeContAcc accLeftSize treeRight cont) | |
let sizeCA tree = sizeContAcc 0 tree (fun x -> x) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment