D Recurrences
Andrei Alexandrescu
SeeWebsiteForEmail at erdani.org
Thu Jun 9 08:36:26 PDT 2011
On 6/9/11 10:19 AM, Ben Grabham wrote:
> Hey,
>
> Shouldn't both these programs output the fibonnacci numbers? Only the
> first one does.
>
> import std.range;
> import std.stdio;
> int main() {
> auto a = recurrence!("a[n-1] + a[n-2]")(0,1);
> int i = 0;
> foreach(int n; a) {
> if(i++ > 20) break;
> writefln("%d", n);
> }
> return 0;
> }
>
>
>
> import std.range;
> import std.stdio;
> int main() {
> auto a = recurrence!("a[n-1] + (n < 2 ? 0 : a[n-2])")(1);
> int i = 0;
> foreach(int n; a) {
> if(i++ > 20) break;
> writefln("%d", n);
> }
> return 0;
> }
The second implementation is in error. The state of the recurrence is
defined by the number of parameters, so it will consist of one number.
Fibonacci needs the last two numbers.
The code doesn't fail because recurrence uses modulus with all indices,
which means a[n-1] and a[n-2] will refer to the same (and only) element
in the recurrence state.
It would be be possible to detect this at run time, but it would slow
things down a bit.
Andrei
More information about the Digitalmars-d
mailing list