3 // Copyright 2009 The Go Authors. All rights reserved.
4 // Use of this source code is governed by a BSD-style
5 // license that can be found in the LICENSE file.
7 // Test that heavy recursion works. Simple torture test for
8 // segmented stacks: do math in unary by recursion.
14 // -------------------------------------
21 func is_zero(x *Number) bool {
25 func add1(x *Number) *Number {
31 func sub1(x *Number) *Number {
35 func add(x, y *Number) *Number {
40 return add(add1(x), sub1(y))
43 func mul(x, y *Number) *Number {
44 if is_zero(x) || is_zero(y) {
48 return add(mul(x, sub1(y)), x)
51 func fact(n *Number) *Number {
56 return mul(fact(sub1(n)), n)
59 // -------------------------------------
60 // Helpers to generate/count Peano integers
62 func gen(n int) *Number {
64 return add1(gen(n - 1))
70 func count(x *Number) int {
75 return count(sub1(x)) + 1
78 func check(x *Number, expected int) {
81 print("error: found ", c, "; expected ", expected, "\n")
86 // -------------------------------------
87 // Test basic functionality
91 check(add1(zero()), 1)
94 check(add(gen(3), zero()), 3)
95 check(add(zero(), gen(4)), 4)
96 check(add(gen(3), gen(4)), 7)
98 check(mul(zero(), zero()), 0)
99 check(mul(gen(3), zero()), 0)
100 check(mul(zero(), gen(4)), 0)
101 check(mul(gen(3), add1(zero())), 3)
102 check(mul(add1(zero()), gen(4)), 4)
103 check(mul(gen(3), gen(4)), 12)
105 check(fact(zero()), 1)
106 check(fact(add1(zero())), 1)
107 check(fact(gen(5)), 120)
110 // -------------------------------------
113 var results = [...]int{
114 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880, 3628800,
119 for i := 0; i <= 9; i++ {
120 if f := count(fact(gen(i))); f != results[i] {
121 println("FAIL:", i, "!:", f, "!=", results[i])