Skip to content

Instantly share code, notes, and snippets.

@smies
Created April 23, 2013 11:26
Show Gist options
  • Save smies/5442827 to your computer and use it in GitHub Desktop.
Save smies/5442827 to your computer and use it in GitHub Desktop.
From Expert F# 3.0
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