30 lines
977 B
Text
30 lines
977 B
Text
F recamanSucc(seen, n, r)
|
||
‘The successor for a given Recaman term,
|
||
given the set of Recaman terms seen so far.’
|
||
V back = r - n
|
||
R I 0 > back | (back C seen) {n + r} E back
|
||
|
||
F recamanUntil(p)
|
||
‘All terms of the Recaman series before the
|
||
first term for which the predicate p holds.’
|
||
V n = 1
|
||
V r = 0
|
||
V rs = [r]
|
||
V seen = Set(rs)
|
||
V blnNew = 1B
|
||
L !p(seen, n, r, blnNew)
|
||
r = recamanSucc(seen, n, r)
|
||
blnNew = r !C seen
|
||
seen.add(r)
|
||
rs.append(r)
|
||
n = 1 + n
|
||
R rs
|
||
|
||
F enumFromTo(m)
|
||
‘Integer enumeration from m to n.’
|
||
R n -> @m .< 1 + n
|
||
|
||
print("First 15 Recaman:\n "recamanUntil((seen, n, r, _) -> n == 15))
|
||
print("First duplicated Recaman:\n "recamanUntil((seen, n, r, blnNew) -> !blnNew).last)
|
||
V setK = Set(enumFromTo(0)(1000))
|
||
print("Number of Recaman terms needed to generate all integers from [0..1000]:\n "(recamanUntil((seen, n, r, blnNew) -> (blnNew & r < 1001 & :setK.is_subset(seen))).len - 1))
|