Recaman's sequence: Difference between revisions
Content added Content deleted
(→A stream-oriented solution: documentation) |
Not a robot (talk | contribs) (Add PL/I) |
||
Line 1,870: | Line 1,870: | ||
Terms up to a[328002] are needed to generate 0 to 1000 |
Terms up to a[328002] are needed to generate 0 to 1000 |
||
</pre> |
</pre> |
||
=={{header|PL/I}}== |
|||
<lang pli>recaman: procedure options(main); |
|||
declare A(0:30) fixed; |
|||
/* is X in the first N terms of the Recaman sequence? */ |
|||
find: procedure(x, n) returns(bit); |
|||
declare (x, n, i) fixed; |
|||
do i=0 to n-1; |
|||
if A(i)=x then return('1'b); |
|||
end; |
|||
return('0'b); |
|||
end find; |
|||
/* generate the N'th term of the Recaman sequence */ |
|||
generate: procedure(n) returns(fixed); |
|||
declare n fixed; |
|||
if n=0 then |
|||
A(0) = 0; |
|||
else do; |
|||
declare (sub, add) fixed; |
|||
sub = A(n-1) - n; |
|||
add = A(n-1) + n; |
|||
/* A(n-1) - n not positive? */ |
|||
if sub <= 0 then |
|||
A(n) = add; |
|||
/* A(n-1) - n already generated? */ |
|||
else if find(sub, n) then |
|||
A(n) = add; |
|||
else |
|||
A(n) = sub; |
|||
end; |
|||
return(A(n)); |
|||
end generate; |
|||
declare (i, j, x) fixed; |
|||
put skip list('First 15 members:'); |
|||
do i=0 to 14; |
|||
put edit(generate(i)) (F(3)); |
|||
end; |
|||
put skip list('First repeated term: '); |
|||
do i=15 repeat(i+1) while(^find(generate(i), i)); end; |
|||
put edit('A(',i,') = ',A(i)) (A,F(2),A,F(2)); |
|||
end recaman;</lang> |
|||
{{out}} |
|||
<pre>First 15 members: 0 1 3 6 2 7 13 20 12 21 11 22 10 23 9 |
|||
First repeated term: A(24) = 42</pre> |
|||
=={{header|PureBasic}}== |
=={{header|PureBasic}}== |