BinaryTrees
Binary Trees
Binary Trees Euphoria
-- The Computer Language Shootout Benchmarks -- http://shootout.alioth.debian.org/ -- -- Converted to Euphoria by Jason Gade -- run: exu binary-trees.ex [N=0] without warning without type_check include std/get.e constant LEFT = 1, RIGHT = 2, ITEM = 3 constant NULL = {} function ItemCheck(sequence tree) if equal(tree[LEFT], NULL) then return tree[ITEM] else return tree[ITEM] + ItemCheck(tree[LEFT]) - ItemCheck(tree[RIGHT]) end if end function -- ItemCheck function BottomUpTree(atom item, integer depth) if depth > 0 then return {BottomUpTree(2 * item - 1, depth - 1), BottomUpTree(2 * item, depth - 1), item} else return {NULL, NULL, item} end if end function -- BottomUpTree procedure main(sequence argv) atom iterations, check integer minDepth, maxDepth, stretchDepth sequence stretchTree, longLivedTree, tempTree object N if length(argv) >= 3 then N = value(argv[3]) N = N[2] else N = 0 end if minDepth = 4 if (minDepth + 2) > N then maxDepth = minDepth + 2 else maxDepth = N end if stretchDepth = maxDepth + 1 stretchTree = BottomUpTree(0, stretchDepth) printf(1, "stretch tree of depth %d\t check: %d\n", {stretchDepth, ItemCheck(stretchTree)}) stretchTree = {} longLivedTree = BottomUpTree(0, maxDepth) for depth = minDepth to maxDepth by 2 do iterations = power(2, maxDepth - depth + minDepth) check = 0 for i = 1 to iterations do tempTree = BottomUpTree(i, depth) check += ItemCheck(tempTree) tempTree = {} tempTree = BottomUpTree(-i, depth) check += ItemCheck(tempTree) tempTree = {} end for -- i printf(1, "%d\t trees of depth %d\t check: %d\n", {iterations * 2, depth, check }) end for -- depth printf(1, "long lived tree of depth %d\t check: %d\n", {maxDepth, ItemCheck(longLivedTree)}) end procedure -- main main(command_line())
Binary Trees Python
# The Computer Language Benchmarks Game # http://shootout.alioth.debian.org/ # # contributed by Antoine Pitrou # modified by Dominique Wahli # modified by Heinrich Acker import sys def make_tree(item, depth): if not depth: return item, None, None item2 = item + item depth -= 1 return item, make_tree(item2 - 1, depth), make_tree(item2, depth) def check_tree((item, left, right)): if not left: return item return item + check_tree(left) - check_tree(right) min_depth = 4 max_depth = max(min_depth + 2, int(sys.argv[1])) stretch_depth = max_depth + 1 print "stretch tree of depth %d\t check:" % stretch_depth, check_tree(make_tree(0, stretch_depth)) long_lived_tree = make_tree(0, max_depth) iterations = 2**max_depth for depth in xrange(min_depth, stretch_depth, 2): check = 0 for i in xrange(1, iterations + 1): check += check_tree(make_tree(i, depth)) + check_tree(make_tree(-i, depth)) print "%d\t trees of depth %d\t check:" % (iterations * 2, depth), check iterations /= 4 print "long lived tree of depth %d\t check:" % max_depth, check_tree(long_lived_tree)
Binary Trees Perl
# The Computer Language Benchmarks Game # http://shootout.alioth.debian.org/ # # contributed by Emanuele Zeppieri sub bottomup_tree { my ($value, $depth) = @_; return $value unless $depth; my $value2 = $value * 2; $depth--; [ bottomup_tree($value2-1, $depth), bottomup_tree($value2, $depth), $value ] } sub check_tree { my ($left, $right, $value) = @{ $_[0] }; $value + ( ref $left ? check_tree($left) - check_tree($right) : $left - $right ) } my $max_depth = shift @ARGV; my $min_depth = 4; $max_depth = $min_depth + 2 if $min_depth + 2 > $max_depth; my $stretch_depth = $max_depth + 1; my $stretch_tree = bottomup_tree(0, $stretch_depth); print "stretch tree of depth $stretch_depth\t check: ", check_tree($stretch_tree), "\n"; undef $stretch_tree; my $longlived_tree = bottomup_tree(0, $max_depth); for ( my $depth = $min_depth; $depth <= $max_depth; $depth += 2 ) { my $iterations = 2 << $max_depth - $depth + $min_depth - 1; my $check = 0; foreach (1..$iterations) { $check += check_tree( bottomup_tree(0, $depth) ); $check += check_tree( bottomup_tree(0, $depth) ) } print 2*$iterations, "\t trees of depth $depth\t check: ", $check, "\n" } print "long lived tree of depth $max_depth\t check: ", check_tree($longlived_tree), "\n"