std.range.Sequence/sequence
- multiple declarations
Function sequence
Sequence
is similar to Recurrence
except that iteration is
presented in the so-called closed form. This means that the n
th element in the series is
computable directly from the initial values and n
itself. This
implies that the interface offered by Sequence
is a random-access
range, as opposed to the regular Recurrence
, which only offers
forward iteration.
auto sequence(alias fun, State...)
(
State args
);
The state of the sequence is stored as a Tuple
so it can be
heterogeneous.
Example
Odd numbers, using function in string form:
auto odds = sequence!("a[0] + n * a[1]")(1, 2);
writeln(odds .front); // 1
odds .popFront();
writeln(odds .front); // 3
odds .popFront();
writeln(odds .front); // 5
Example
Triangular numbers, using function in lambda form:
auto tri = sequence!((a,n) => n*(n+1)/2)();
// Note random access
writeln(tri[0]); // 0
writeln(tri[3]); // 6
writeln(tri[1]); // 1
writeln(tri[4]); // 10
writeln(tri[2]); // 3
Example
Fibonacci numbers, using function in explicit form:
import std .math .exponential : pow;
import std .math .rounding : round;
import std .math .algebraic : sqrt;
static ulong computeFib(S)(S state, size_t n)
{
// Binet's formula
return cast(ulong)(round((pow(state[0], n+1) - pow(state[1], n+1)) /
state[2]));
}
auto fib = sequence!computeFib(
(1.0 + sqrt(5.0)) / 2.0, // Golden Ratio
(1.0 - sqrt(5.0)) / 2.0, // Conjugate of Golden Ratio
sqrt(5.0));
// Note random access with [] operator
writeln(fib[1]); // 1
writeln(fib[4]); // 5
writeln(fib[3]); // 3
writeln(fib[2]); // 2
writeln(fib[9]); // 55
Struct Sequence
Sequence
is similar to Recurrence
except that iteration is
presented in the so-called closed form. This means that the n
th element in the series is
computable directly from the initial values and n
itself. This
implies that the interface offered by Sequence
is a random-access
range, as opposed to the regular Recurrence
, which only offers
forward iteration.
struct Sequence(alias fun, State)
;
The state of the sequence is stored as a Tuple
so it can be
heterogeneous.
Example
Odd numbers, using function in string form:
auto odds = sequence!("a[0] + n * a[1]")(1, 2);
writeln(odds .front); // 1
odds .popFront();
writeln(odds .front); // 3
odds .popFront();
writeln(odds .front); // 5
Example
Triangular numbers, using function in lambda form:
auto tri = sequence!((a,n) => n*(n+1)/2)();
// Note random access
writeln(tri[0]); // 0
writeln(tri[3]); // 6
writeln(tri[1]); // 1
writeln(tri[4]); // 10
writeln(tri[2]); // 3
Example
Fibonacci numbers, using function in explicit form:
import std .math .exponential : pow;
import std .math .rounding : round;
import std .math .algebraic : sqrt;
static ulong computeFib(S)(S state, size_t n)
{
// Binet's formula
return cast(ulong)(round((pow(state[0], n+1) - pow(state[1], n+1)) /
state[2]));
}
auto fib = sequence!computeFib(
(1.0 + sqrt(5.0)) / 2.0, // Golden Ratio
(1.0 - sqrt(5.0)) / 2.0, // Conjugate of Golden Ratio
sqrt(5.0));
// Note random access with [] operator
writeln(fib[1]); // 1
writeln(fib[4]); // 5
writeln(fib[3]); // 3
writeln(fib[2]); // 2
writeln(fib[9]); // 55
Authors
Andrei Alexandrescu, David Simcha, Jonathan M Davis, and Jack Stouffer. Credit for some of the ideas in building this module goes to Leonardo Maffi.