簡體   English   中英

遞歸匿名函數Matlab

[英]Recursive Anonymous Function Matlab

我知道這不是匿名函數的用途,但就像我試圖通過匿名函數創建遞歸函數一樣。 遞歸函數的原型顯然是階乘函數。 問題是,它是很難使匿名函數的情況區分。 到目前為止我設法做的是:

f=@(cn,n,f)eval('if n>1; f(cn*n,n-1,f);else;ans=cn;end');
f=@(n)f(1,n,f);

或者:

f=@(cn,n,f)eval('if n>1; f(cn*n,n-1,f);else;disp(cn);end');
f=@(n)f(1,n,f);

不太令人滿意的是,在直接分配時仍然無法使用此功能, a=f(3)仍然會產生錯誤,因為eval沒有得到值。

所以我的問題是,您是否可以通過匿名函數實際執行遞歸函數,例如以允許例如a=f(3)的方式計算階乘,僅依賴於本機matlab函數(或者您可以在命令行中創建的函數,如我在我的例子中做過)?

PS:我知道這沒有任何實際用途,這只是對你可以彎曲和濫用Matlab語法的挑戰。

我們現在發現了兩種可能性,都依賴於細胞陣列的使用。 請注意,這可能不適用於Octave。

關鍵是案例區分的實施。 我找到的第一個可以在這里找到

此方法使用matlabs布爾值,true可以計算為1而false可以計算為0

if_ = @( pred_, cond_ ) cond_{ 2 - pred_ }();

這里我們必須提供一個條件作為第一個參數,一個2元素單元格數組作為第二個參數。 每個單元格元素應該是一個函數句柄,如果條件為真/不為真,則調用該函數句柄。 我們的階乘函數看起來像這樣:

fac = @(n,f)if_(n>1,{@()n*f(n-1,f),@()1})
factorial_=@(n)fac(n,fac);
factorial_(10)

正如@AndrasDeak評論如下:這里的重要部分是我們有一個函數的單元格數組而不是 這提供了短路,由於n*f(n-1,f)不評估除非我們調用相應的功能@()n*f(n-1,f)

第二種方法是由@beaker發現的,並且更靈活一些:

iif = @(varargin) varargin{2*find([varargin{1:2:end}], 1, 'first')}();

這利用了即使在匿名函數中也可以使用varargin (可變數量的參數)這一事實。 當你調用這個函數時,你必須交替條件,如果條件為真,應該執行什么。 這個甚至允許一個switch構造,或者if ... else if ... else if ... (...) else ...構造。 調用時,它將查找第一個為true的條件( find([varargin{1:2:end}], 1, 'first') )並調用相應的函數。 我們的階乘函數示例如下所示:

fac = @(n,f)iif(n>1,@()n * f(n-1,f),true,@()1);
factorial_=@(n)fac(n,fac);
factorial_(10)

編輯:有趣的事實:我們正在做什么線

 factorial_=@(n)fac(n,fac);

也被稱為應用Y-組合子 事實上,我們可以寫為

 Y = @(f)@(x)f(x,f);
 factorial_=Y(f);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM