Fibonacci-Zahlen mit dysfunctional.JS

03.04.2011

Eine Funktion, die die Fibonacci-Zahlen berechnet, geschrieben mit dysfunctional.JS:

var fib = dysfunctional.generator(
	function(n, m){
		return [m, n+m];},
	[1, 0],
	dysfunctional.first);

Sukzessive Aufrufe fib() liefern dann: 0, 1, 1, 2, 3, 5, 8, usw., eben die Fibonacci-Folge.

Zur Erklärung:
dysfunctional.generator akzeptiert zwei bis drei Parameter:

  1. Eine Berechnungsfunktion, die bei jedem Aufruf erneut auf den bisherigen Wert angewendet wird. Der Rückgabewert muss ein Array sein, dieses enthält auch die Argumente für den nächsten Aufruf der Berechnungsfunktion. Hier ist diese Funktion function(n, m){ return [m, n+m]; } – es werden aus den zwei vorigen Fibonacci-Zahlen n und m die nächsten zwei berechnet.
  2. Ein Startwert. In diesem Fall ist das [1, 0]. Soll die Folge nicht mit der 0, sondern mit 1 beginnen (kann für verschiedene Einsatzzwecke sinnvoll sein), so könnte auch [0, 1] verwendet werden.
  3. Optional: Eine Extraktionsfunktion, die aus dem Rückgabewert der Berechnungsfunktion den eigentlichen Rückgabewert der Generator-Funktion extrahiert. Da uns nur der erste Wert interessiert, ist das dysfunctional.first, diese Funktion gibt den ersten Wert eines Arrays zurück.

    Natürlich könnte eine solche Funktion genauso komplett manuell geschrieben werden:

    var fib = (function(){
    	var state = [1, 0];
    	return function(){
    		state = [state[1], state[0] + state[1]];
    		return state[0];};})();

    Die dysfunctional.JS-Variante ist jedoch flexibler, da leicht eine Funktion geschrieben werden kann, die auch abgewandelte Berechnungen oder andere Startwerte akzeptiert. Das ist zwar genauso manuell möglicher, jedoch ein wenig aufwendiger, denn man muss genau die Arbeit, die einem die Generator-Funktion abgenommen hätte, selbst erledigen.