Generating Fibonacci numbers with an enumerator
for i in Fibonacci(10) do Writeln(i);Of course you need a Fibonacci-implementing enumerator. I wrote one on 2007 and it uses the iterative approach. Read more in my old article Fun with enumerators, part 6 – generators.
Generating Fibonacci numbers with anonymous methods
This one was prepared for ITDevCon 2011 as an example of tricky (but pretty much useless) example of what can be done using anonymous methods.
var fib: TFunc<integer>; begin fib := Fibonacci(10); Writeln(fib()); end;In this example, Fibonacci(10) call doesn’t really calculate Fibonacci numbers. It only sets up a recursive anonymous method that calculates one specific Fibonacci number (in case the tenth element) when it is executed by calling fib().
function FibonacciList(elNum: integer): TFunc<integer>; var el1: TFunc<integer>; el2: TFunc<integer>; begin if elNum = 1 then Result := function: integer begin Result := 0; end else if elNum = 2 then Result := function: integer begin Result := 1; end else begin el1 := FibonacciList(elNum-1); el2 := FibonacciList(elNum-2); Result := function: integer begin Result := el1() + el2(); end; end; end; function Fibonacci(elNum: integer): TFunc<integer>; begin Result := FibonacciList(elNum); end;[A note to ITDevCon audience – this is updated version of the code I’ve shown in Verona. A note to Yanniel’s readers – he’s counting numbers from 0, I’m doing it from 1 so his Fibonacci(9) is my Fibonacci(10).]