(C) 2009 - 2021 by Mourad Louha · Alle Rechte vorbehalten

LAMBDA-Funktionen als Variable rekursiv verwenden

Seit Ende 2020 steht in Excel – derzeit noch in der Beta-Version – die Funktion LAMBDA zur Verfügung, die es ermöglicht benutzerdefinierte Funktionen anzulegen. Eine detaillierte Einführung zu der LAMBDA-Funktion ist hier zu finden. Welche Möglichkeiten LAMBDA bietet, zeigt beispielsweise meine benutzerdefinierte Funktion TEXT.SPLIT zum Aufteilen eines Textes nach Trennzeichen, die ich im gleichnamigen Artikel beschrieben habe.

LAMBDA-Funktionen können auch rekursiv aufgerufen werden, sofern ein Abbruchkriterium definiert ist. Da jedoch benutzerdefinierte Funktionen im Namensmanager abgelegt werden, sind rekursive Funktion recht schwer zu debuggen, da ja jedesmal die im Namensmanager hinterlegte Funktion geändert werden muss. Dieser Artikel zeigt einen Weg auf, wie sich einerseits LAMBDA-Funktionen als Variable verwenden lassen und andererseits eine Rekursion ohne Definition der LAMBDA-Funktion im Namensmanager realisiert werden kann.

LAMBDA-Funktionen als Variable rekursiv verwenden

Ein einfaches Beispiel einer Rekursion

Nehmen wir mal an, wir erstellen eine ganz simple LAMBDA-Funktion, die auf eine Zahl X den Wert 10 addiert. Eine solche Funktion lässt sich wie folgt definieren:

=LAMBDA(X;LET(S;X+10;S))

Wenn ich diese Funktion im Namensmanager hinterlege und als PLUSZEHN benenne, lässt sich in meiner Arbeitsmappe diese Funktion beispielsweise wie folgt verwenden:

=PLUSZEHN(1)     > ergibt 11
=PLUSZEHN(A1)    > ergibt 12, wenn A1=2

Machen wir nun aus der Funktion eine Rekursion: und zwar soll die Funktion solange den Wert 10 auf den Wert der vorherigen Berechnung aufaddieren wie das Ergebnis kleiner 100 ist. Eine solche Definition der LAMBDA-Funktion sieht dann wie folgt aus:

=LAMBDA(X;LET(S;X+10;WENN(S<100;PLUSZEHN(S);S)))

Damit die Rekursion auch bei einem Aufruf von PLUSZEHN wirkt, muss die Formel im Namensmanager auch entsprechend geändert werden. Das Ergebnis von PLUSZEHN sieht nun anders aus:

=PLUSZEHN(1)     > ergibt 101
=PLUSZEHN(25)    > ergibt 105
=PLUSZEHN(20)    > ergibt 100

Was passiert da nun genau? Simulieren wir die Rekursion für den Eingangswert 25 in der nachfolgend abgebildeten Excel-Tabelle.

Rekursion simulieren

Zu dem Startwert 25 wird die Zahl 10 aufaddiert, was 35 ergibt. Das Ergebnis ist kleiner als 100 und somit wird die Zahl 35 der LAMBDA-Funktion als Startwert übergeben. Diese Iteration liefert den Wert 45, der ebenfalls kleiner als 100 ist. Die Rekursion wird bis zu dem Zeitpunkt durchgeführt, wo das Ergebnis gleich 95 ist. Eine Addition von 10 ergibt dann den Wert 105, der nun nicht kleiner 100 ist und als Endergebnis zurückgegeben wird.

Eine LAMBDA-Funktion als Variable verwenden

LAMBDA-Funktionen lassen sich auch als Variable innerhalb der LET-Funktion definieren und aufrufen. Und zwar ohne die LAMBDA-Funktion zuvor im Namensmanger angelegen zu müssen. Ein einfaches Beispiel:

=LET(Value;1;F;LAMBDA(X;LET(S;X+10;S));F(Value))

In diesem Beispiel wurde die LAMBDA-Funktion als Variable F definiert. Der Aufruf von F erfolgt am Ende von LET über F(Value), wo Value in diesem Fall den Wert 1 hat. Das Ergebnis ist somit 11. Natürlich liesse sich auch statt der 1 eine Zelle für Eingangswert Value definieren, z.B. A1.

Eine LAMBDA-Funktion als Variable rekursiv verwenden

Was aber wenn ich mit der innerhalb von LET definierten LAMBDA-Funktion eine Rekursion verwenden möchte? Probieren wir es aus:

=LET(Value;1;F;LAMBDA(X;LET(S;X+10;WENN(S<100;F(S);S)));F(Value))

Excel zeigt in diesem Fall den Fehler #NAME? an. Das heißt somit, dass der Funktionsname F innerhalb der LAMBDA-Funktion nicht erkannt wurde. Und liegt daran, dass LAMBDA-Funktionen sich wie eine Art Blackbox verhalten und in sich geschlossen sind. Das Problem lässt sich jedoch umgehen, indem der Funktionsname selbst als Variable übergeben wird. Die Formel sieht dann wie folgt aus:

=LET(Value;1;F;LAMBDA(This;X;LET(S;X+10;WENN(S<100;This(This;S);S)));F(F;Value))

Wer es gerne etwas kryptischer mag, kann folgende Formel verwenden, die dann auch letztlich die Gültigkeitsbereiche der Variablen aufzeigt:

=LET(Value;1;F;LAMBDA(F;X;LET(S;X+10;WENN(S<100;F(F;S);S)));F(F;Value))

Das erste Variable F definiert die Funktion innerhalb von LET, das zweite Variable mit dem Namen F ist nur innerhalb der LAMBDA-Funktion gültig.

Fazit

Dadurch, dass sich LAMBDA-Funktionen innerhalb einer LET-Funktion definieren und sogar rekursiv verwenden lassen, kann das Testen und Debuggen von rekursiven LAMBDA-Funktionen komfortabler gestaltet werden.

Viel spannender finde ich allerdings die sich hieraus ergebende Möglichkeit, zum Beispiel rekursive LAMBDA-Funktionen innerhalb einer LAMBDA-Funktion definieren und verwenden zu können. Sozusagen als interne Hilfsfunktionen. In einem weiteren Artikel zu einer LAMBDA-Funktion, die einen Bereich in JSON-Daten umwandelt, werde ich von dieser Möglichkeit Gebrauch machen.

Happy Exceling :-)

 

 
Comments

No comments yet.