lambda是匿名函式,因為沒有名字,也沒有關鍵字引用自身,因此遞迴的編碼就成了問題。
一、最簡單有效的方案是:
func f =null; //變數須先賦值才能使用
f = n=> n==0?1:n*f(n-1
);f(
11); //
==39916800
有人擔心f會被惡意修改,因為就是乙個委託變數,而且認為f是委託,而不是匿名函式自身,所以不算匿名函式遞迴。我覺得,雖然是委託,但是引用的就是匿名函式,函式指標呼叫的函式難道不是函式自身嗎?
二、要避免變數被惡意修改,方案是:
func f = null;f = n =>
f(11);
皆大歡喜。
三、奇葩
funcint,int>,func> g = f => f = n => n==0?1:n*f(n-1);g(
null)(11);
四、不動點技術
funcfx(func,func>g)func
int,int>,func> g = f => n => n==0?1:n*f(n-1
);fx(g)(
11);
fx(g) 返回 x=>g(fx(g))(x)即是g ;f = fx(g)。 因為fx(g) = x=>g(fx(g))(x) 即等於g。
所以,f=g。即函式g(f) 等於g(g)呼叫自身。
這個不動點技術相當麻煩(理解起來費勁),因為c#語言的缺陷(泛型引數約束不能是委託等),不能夠通用化func,也就是遞迴函式不能通用化,而需要編寫n個不同fx。
如:funcfx(func,func> g) 等。
不動點之所以能夠成功,在於它生成了乙個等價於g的委託。fx(g)返回委託,而非遞迴自身,所以不會遞迴溢位(一開始我居然沒留意到這點)。
匿名函式遞迴
lambda是匿名函式,因為沒有名字,也沒有關鍵字引用自身,因此遞迴的編碼就成了問題。一 最簡單有效的方案是 func f null 變數須先賦值才能使用 f n n 0?1 n f n 1 f 11 39916800 有人擔心f會被惡意修改,因為就是乙個委託變數,而且認為f是委託,而不是匿名函式自...
遞迴,匿名函式
目錄匿名函式 函式的巢狀呼叫 函式巢狀函式。函式的遞迴呼叫 它是一種特殊的巢狀呼叫,但是它在呼叫乙個函式過程中,有直接間接呼叫了自身。def foo print from foo foo foo 進入死迴圈def bar print from bar foo def foo print from f...
scheme匿名函式遞迴
匿名函式與 有名函式 scheme中匿名函式使用 lambda 函式實現,格式為 lamdba 例如 lambda i i 3 接受乙個引數,返回它與3的和呼叫方法為 lambda i i 3 2 5而有名函式的定義方式和呼叫方式如下 define 格式 define function n 例子 n...