A recursive GCD implementation in gforth
by Timmy Jose
In the previous post, I presented an interative version of the GCD calculator. As an extension, here is the recursive version of the same.
This post also demonstrates the use of the assert(
word which simply asserts that the flag between the assert(
and ‘)’ words is true, failing which, the
Forth system throws an assertion error.
Here is the program:
\ a simple gcd calculator using recursion
: not ( bool -- bool )
0= ;
: gcd ( u1 u2 -- gcd )
\ we do not support the case where both numbers are 0
assert( over 0<> over 0<> or )
dup 0= if drop else
swap over mod recurse
then
;
Sample run:
$ gforth
Gforth 0.7.3, Copyright (C) 1995-2008 Free Software Foundation, Inc.
Gforth comes with ABSOLUTELY NO WARRANTY; for details type `license'
Type `bye' to exit
s" gcd.fs" included ok
12 18 gcd . 6 ok
18 12 gcd . 6 ok
2 1024 gcd . 2 ok
23 929 gcd . 1 ok
1 0 gcd . 1 ok
0 1 gcd . 1 ok
0 0 gcd . gcd.fs:7: failed assertion
:8: assertion failed
0 0 >>>gcd<<< .
Backtrace:
$10E6E79A8 throw
$10E70ECA8 c(abort")
$10E73A308 (end-assert)