diff --git a/ChangeLog b/ChangeLog index adc9819d..860b8efc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2007-11-08 Paolo Bonzini + + * tests/ackermann.st: Add "iterative" implementation. + 2007-11-07 Paolo Bonzini * examples/Methods.st: Add brackets around compiled methods. diff --git a/tests/ackermann.st b/tests/ackermann.st index 2dee8d1f..3266e130 100644 --- a/tests/ackermann.st +++ b/tests/ackermann.st @@ -34,6 +34,28 @@ Integer extend [ n = 0 ifTrue: [ ^self - 1 ack: 1 ]. ^self - 1 ack: (self ack: n - 1) ] + + ackIt: nn [ + | n | + ^[ + | m stack | + m := self. n := nn. + stack := OrderedCollection new. + [ m = 0 + ifTrue: [ + n := n + 1. + m := stack removeLast ] + ifFalse: [ + n = 0 + ifTrue: [ + m := m - 1. + n := 1 ] + ifFalse: [ + stack addLast: m - 1. + n := n - 1 ] ] + ] repeat + ] on: Error do: [ :ex | ex return: n ] + ] ] Eval [ @@ -41,6 +63,5 @@ Eval [ ifTrue: [ 4 ] ifFalse: [ Smalltalk arguments first asInteger ]. - ('Ack(3,%1): %2' % { n. (3 ack: n) }) displayNl - + ('Ack(3,%1): %2' % { n. (3 ack: n) }) displayNl. ]