2016-03-30 16 views
3

Ich möchte wiederholt eine Funktion anwenden, die eine frühere Ausgabe als neue Eingabe verwendet. Aus Gründen der Lesbarkeit (ich schreibe aus einer mathematischen Perspektive, nicht aus der Perspektive eines Programmierers), möchte ich es als eine einfache anonyme Funktion anstelle eines vollständigen Funktionsblocks definieren. Anstatt also so etwas wieIst es möglich, eine rekursive anonyme Funktion in MATLAB zu haben?

function f=myfun(x,n) 
    if n>1 
     f=myfun(myfun(x,n-1),1); 
    else 
     f=expression(x); 
    end 
end 

würde Ich mag Lage sein

[email protected](x,n) ???? 

zu schreiben Gibt es eine Möglichkeit, dies möglich ist?

+0

Sie können aber ich bezweifle, Sie wollen. Werfen Sie einen Blick auf [Loren Shures Artikel über funktionale Programmierung mit anonymen Funktionen] (http://blogs.mathworks.com/loren/2013/01/10/introduction-to-functional-programming-with-anonymous-functions-part- 1/# c8d04efb-1a2d-4c35-afff-dd52e6c660d2) besonders im Abschnitt "Inline-Bedingungen". – Dan

Antwort

8

Die einzige Möglichkeit, eine rekursive anonyme Funktion in MATLAB zu haben, besteht darin, die Funktion handle an 10 selbst als Eingabe zu übergeben. Sie können es dann innerhalb der anonymen Funktion aufrufen.

Dies führt offensichtlich zu unendlicher Rekursion, da Sie keine Verzweigungslogik haben. Wenn Sie die Verzweigungslogik simulieren möchten, müssen Sie eine andere anonyme Funktion implementieren diese (iif Funktion von here entlehnt) zu tun:

%// Anonymous function to simulate if/elseif/else 
iif = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}(); 

%// Your anonymous function that is recursive AND has branching 
myfun = @(f,x,n)iif(n > 1, ...      % if n > 1 
        @()f(f, f(f, x, n-1), 1), ... % Recurse 
        true, ...      % else 
        @()expression(x));    % Execute expression() 

Es ist eine wirklich solid series of blog entries auf der Mathworks Website, die über diese Art geht von Funktionale Programmierung mit anonymen Funktionen.

Ein Wort der Vorsicht

Zwar ist dies eine interessante Übung, ich würde auf jeden Fall nicht mit diesem empfehlen, wenn Sie jemand wollen Ihren Code leicht zu verstehen. Es ist viel einfacher und klarer, eine Standardfunktion zu debuggen. Wenn Sie dann wirklich eine anonyme Funktion benötigen, müssen Sie den Aufruf an diese Funktion in einer anonymen Funktion weiterleiten.

myanonfunc = @(varargin)myfunc(varargin{:}); 

Oder erstellen Sie einfach eine Funktion Griff in die Funktion

myfunchandle = @myfunc; 
+0

@sanchises Der einzige Weg, wie ich verzweigende Logik ausführen kann, ist der zweite Weg. Ich würde definitiv davon abraten, diese Art von funktionaler Programmierung in MATLAB zu machen, und würde mich an Standardfunktionen halten, da dies die Lesbarkeit auf jeden Fall beeinträchtigt. Die Blogeinträge sind * definitiv * aber interessant. – Suever

+0

Ja, sie sind - vielen Dank, und ich werde es nicht für das verwenden, was ich gerade mache, aber es ist sicherlich eine Überlegung wert für andere Projekte. – Sanchises

+0

@sanchises Ich habe es aktualisiert. Es gab einen kleinen Fehler, aber es sollte jetzt die Ausgabe Ihrer ursprünglichen Funktion duplizieren. – Suever

Verwandte Themen