RosettaCodeData/Task/Fusc-sequence/Forth/fusc-sequence.fth

43 lines
1014 B
Forth

\ Gforth 0.7.9_20211014
: fusc ( n -- n) \ input n -- output fusc(n)
dup dup 0= swap 1 = or \ n = 0 or 1
if exit \ return n
else dup 2 mod 0= \ test even
if 2/ recurse \ even fusc(n)= fusc(n/2)
else dup 1- 2/ recurse \ odd fusc(n) = fusc((n-1)/2) +
swap 1+ 2/ recurse + \ fusc((n+1)/2)
then
then
;
: cntDigits ( n -- n ) \ returns the numbers of digits
0 begin 1+ swap
10 /
swap over
0= until
swap drop
;
: fuscLen ( n -- ) \ count until end index
cr 1 swap 0
do
i fusc cntDigits
over > if 1+
." fusc( " i . ." ) : "
i fusc . cr
then
loop
;
: firstFusc ( n -- ) \ show fusc(i) until limit
dup ." First " . ." fusc(n) : " cr
0 do I fusc . loop cr
;
61 firstFusc
20 1000 1000 * * fuscLen
bye