2016-03-30 17 views
3

Tekrar tekrar, yeni giriş olarak geçmiş çıkışı kullanarak bir işlev uygulamak istiyorum. Okunabilirlik için (bir matematik perspektifinden değil, programcı perspektifinden yazıyorum), tam işlev bloğu yerine basit bir anonim işlev olarak tanımlamak isterim. Yani, yerineMATLAB'de tekrarlayan bir anonim fonksiyona sahip olmak mümkün mü?

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

gibi bir şey ben

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

bu mümkün herhangi bir yolu var mı yazabilmek istersiniz?

+0

yapabilirsiniz için bir işlev tanıtıcı oluşturmak ama ben öyle istiyorum şüpheliyim. [Loren Shure'ın anonim işlevler kullanarak işlevsel programlama ile ilgili makalesine bakın] (http://blogs.mathworks.com/loren/2013/01/10/introduction-to-functional-programming-with-anonymous-functions-part- 1/# c8d04efb-1a2d-4c35-afff-dd52e6c660d2) özellikle "inline koşullu" bölümünde. – Dan

cevap

8

MATLAB'de özyinelemeli bir anonim işlevine sahip olmanın tek yolu, işlev tanıtıcısını bir girdi olarak geçirmektir. Daha sonra anonim işlevinden onu çağırabilirsiniz.

%// The first input f is going to be an anonymous function 
myfun = @(f,x,n) f(f, x, n+1); 

%// Then use your anonymous function like this (note the first input) 
out = myfun(myfun, x, n); 

Bu, herhangi bir dallanma mantığınız olmadığı için sonsuz yineleme ile sonuçlanacaktır. Eğer dallanma mantığı simüle etmek istiyorsanız, bu (here ödünç iif fonksiyonunu) yapmak için başka bir anonim işlevi uygulamak gerekir:

%// 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() 

gerçekten solid series of blog entries bu tür üzerine çıkması Mathworks sitede mevcuttur anonim işlevler kullanarak fonksiyonel programlama.

bu ilginç egzersiz olmasına rağmen Dikkat ait

A Word, kesinlikle kimsenin kolayca kodunuzu anlamak istiyorsanız bu kullanarak tavsiye etmem. Standart bir işlevde hata ayıklamak çok daha kolay ve kolaydır. Daha sonra anonim bir işleve ihtiyacınız varsa, anonim bir işlevle bu işleve çağrıyı sarın.

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

Ya da sadece fonksiyonu

myfunchandle = @myfunc; 

+0

@sanchises Dallanma mantığını gerçekleştirmek için bildiğim tek yol, ikinci yoldur. MATLAB'da bu tür bir fonksiyonel programlamayı kesinlikle yapmaktan vazgeçerdim ve kesinlikle okunabilirliği acıtıyor olduğu için standart fonksiyonlara sadık kalırdım. Blog girişleri * kesinlikle * ilginç bir okuma olsa da. – Suever

+0

Evet, çok teşekkür ederim, ve şu anda yaptığım şey için kullanmayacağım ama kesinlikle diğer projeler için dikkate değer. – Sanchises

+0

@sanchises Bunu güncelledim. Küçük bir hata vardı ama şimdi orijinal işlevinizin çıktısını çoğaltmalı. – Suever

İlgili konular