Rebol3 Code Examplex


Recaman's sequence

Generate the Recamán sequence.

Rebol [
    title: "Rosetta code: Recaman's sequence"
    file:  %Recaman's_sequence.r3
    url:   https://rosettacode.org/wiki/Recaman%27s_sequence
]

recaman-until: function/with [code [block!]][
    r: 0 n: 1
    result: reduce [r] ;; result sequence
    seen:   reduce [r] ;; set of visited values for O(1) duplicate check
    bind code 'n
    until [
        append result r: recaman-succ seen n r
        if new?: not find seen r [ append seen r ]
        ++ n
        do code        ;; evaluate stop condition with current n in scope
    ]
    result
][
    recaman-succ: function [seen [block!] n [integer!] r [integer!]][
        back: r - n
        ;; go back if positive and not already seen, otherwise go forward
        either any [back < 0  find seen back] [r + n] [back]
    ]
]

print "First 15 Recaman numbers:"
print recaman-until [n = 15]
print ""
print "First duplicate Recaman number:"
print last recaman-until [not new?]