]> Cypherpunks.ru repositories - gostls13.git/commitdiff
add new test - factorial by inc and dec
authorRob Pike <r@golang.org>
Sat, 12 Jul 2008 20:20:21 +0000 (13:20 -0700)
committerRob Pike <r@golang.org>
Sat, 12 Jul 2008 20:20:21 +0000 (13:20 -0700)
SVN=126937

test/peano.go [new file with mode: 0644]

diff --git a/test/peano.go b/test/peano.go
new file mode 100644 (file)
index 0000000..bc52c06
--- /dev/null
@@ -0,0 +1,131 @@
+// $G $F.go && $L $F.$A && ./$A.out
+
+// Copyright 2009 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package main
+
+type Number struct {
+       next *Number
+}
+
+
+// -------------------------------------
+// Peano primitives
+
+func zero() *Number {
+       return nil;
+}
+
+
+func is_zero(x *Number) bool {
+       return x == nil;
+}
+
+
+func add1(x *Number) *Number {
+       e := new(Number);
+       e.next = x;
+       return e;
+}
+
+
+func sub1(x *Number) *Number {
+       return x.next;
+}
+
+
+func add(x, y *Number) *Number{
+       if is_zero(y) {
+               return x;
+       }
+
+       return add(add1(x), sub1(y));
+}
+
+
+func mul(x, y *Number) *Number {
+       if is_zero(x) || is_zero(y){
+               return zero();
+       }
+
+       return add(mul(x, sub1(y)), x);
+}
+
+
+func fact(n *Number) *Number {
+       if is_zero(n) {
+               return add1(zero());
+       }
+
+       return mul(fact(sub1(n)), n);
+}
+
+
+// -------------------------------------
+// Helpers to generate/count Peano integers
+
+func gen(n int) *Number {
+       if n > 0 {
+               return add1(gen(n - 1));
+       }
+
+       return zero();
+}
+
+
+func count(x *Number) int {
+       if is_zero(x) {
+               return 0;
+       }
+
+       return count(sub1(x)) + 1;
+}
+
+
+func check(x *Number, expected int) {
+       var c = count(x);
+       if c != expected {
+               panic "error: found ", c, "; expected ", expected, "\n";
+       }
+}
+
+
+// -------------------------------------
+// Test basic functionality
+
+func verify() {
+       check(zero(), 0);
+       check(add1(zero()), 1);
+       check(gen(10), 10);
+
+       check(add(gen(3), zero()), 3);
+       check(add(zero(), gen(4)), 4);
+       check(add(gen(3), gen(4)), 7);
+
+       check(mul(zero(), zero()), 0);
+       check(mul(gen(3), zero()), 0);
+       check(mul(zero(), gen(4)), 0);
+       check(mul(gen(3), add1(zero())), 3);
+       check(mul(add1(zero()), gen(4)), 4);
+       check(mul(gen(3), gen(4)), 12);
+
+       check(fact(zero()), 1);
+       check(fact(add1(zero())), 1);
+       check(fact(gen(5)), 120);
+}
+
+
+// -------------------------------------
+// Factorial
+
+
+func main() {
+       
+       verify();
+       for i := 0; i <= 10; i++ {
+               print i, "! = ", count(fact(gen(i))), "\n";
+       }
+}
+