Constructing SVector with a loop

Probably not a valid solution, but fun anyway:

function SFibNtuple(::Val{S}) where S
    val_i_minus_2 = Ref(1)
    val_i_minus_1 = Ref(1)
    tup = ntuple(S) do i
        if i == 1 || i == 2
            1
        else
            val = val_i_minus_2[] + val_i_minus_1[]
            val_i_minus_2[] = val_i_minus_1[]
            val_i_minus_1[] = val
        end
    end
    SVector(tup)
end

This infers up to Val(10).

using BenchmarkTools
@btime SFibNtuple(Val(10));

prints 1.702 ns (0 allocations: 0 bytes).

1 Like