Rebol3 Code Examplex


Padovan n-step number sequences

Generate Padovan-style recurrence sequences.

Rebol [
    title: "Rosetta code: Padovan n-step number sequences"
    file:  %Padovan_n-step_number_sequences.r3
    url:   https://rosettacode.org/wiki/Padovan_n-step_number_sequences
]

padovan-sequences: function [
    "Returns a flat block encoding a 2D array of Padovan n-step sequences"
    max-s [integer!]  "Maximum number of steps (must be >= 2)"
    max-e [integer!]  "Maximum number of elements per sequence"
][
    ;; 2D array stored as flat block, indexed as arr[s][e]
    ;; s ranges 2..max-s, e ranges 1..max-e
    arr: make vector! compose [uint16! ((max-s - 1) * max-e)]

    ;; Index helper: maps (s, e) to a 1-based position in the flat block
    idx: func [s e] [(s - 2) * max-e + e]

    ;; Sequence 2: P(2,1..3) = 1, then P(2,x) = P(2,x-2) + P(2,x-3)
    repeat x min 3 max-e [ arr/(idx 2 x): 1 ]
    if max-e >= 4 [
        for x 4 max-e 1 [
            arr/(idx 2 x): arr/(idx 2 x - 2) + arr/(idx 2 x - 3)
        ]
    ]
    ;; Sequences 3 and above:
    ;; - seed first (n+1) elements from the previous sequence
    ;; - then P(n,x) = sum of P(n, x-n-1 .. x-2)
    for n 3 max-s 1 [
        repeat x min (n + 1) max-e [
            arr/(idx n x): arr/(idx n - 1 x) ;; inherit seed from sequence n-1
        ]
        for x (n + 2) max-e 1 [
            sum: 0
            for p (x - n - 1) (x - 2) 1 [
                sum: sum + arr/(idx n p)   ;; sum over n consecutive predecessors
            ]
            arr/(idx n x): sum
        ]
    ]
    arr
]

;; Compute sequences for steps 2..8, each showing 15 elements
data: padovan-sequences max-s: 8 max-e: 15
print "Padovan n-step sequences:"
for s 2 max-s 1 [
    prin [s "|"]
    for e 1 max-e 1 [
        val: data/((s - 2) * max-e + e)
        prin pad val -4
    ]
    prin LF
]