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))