Search
View source code
Display the source code in std/range/package.d from which this page was generated on github.
Report a bug
Quickly fork, edit online, and submit a pull request for this page. Requires a signed-in GitHub account. This works well for small changes. If you'd like to make larger changes you may want to consider using local clone.

# `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.