[英]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.