起因 老趙
使用lambda表示式編寫遞迴函式
經過 鶴沖天
反駁老趙之「偽」遞迴
結果 james.ying
駁「反駁老趙之「偽」遞迴」
摘要:老趙提了個「偽」遞迴的說法
funcfac = null;第一次列印出的120是正確的結果。不過facalias從fac那裡「接過」了使用lambda表示式構造的委託物件之後,我們讓fac引用指向了新的匿名方法x => x。於是facalias在呼叫時:fac = x => x <= 1 ? 1 : x * fac(x - 1);
console.writeline(fac(5)); // 120;
funcfacalias = fac;
fac = x => x;
console.writeline(facalias(5)); // 20
facalias(5) x <= 1 ? 1 : x * fac(x – 1)自然就不對了。= 5 <= 1 ? 1 : 5 * fac(5 - 1)
= 5 * fac(4) x
= 5 * 4
= 20
老趙其實解釋得也很清楚:
這個lambda表示式構造的「委託物件」在呼叫時,它會去尋找fac這個引用所指向的委託物件。請注意,這裡是根據「引用」去找「物件」,這意味著lambda表示式構造的委託物件在呼叫時,fac可能已經不再指向當初的委託物件了。
我理解的意思就是老趙說facalias的定義雖然看起來很像遞迴,但是本質上不是遞迴,所以一時興起起個名字叫「偽」遞迴
結果人家鶴沖天不幹了,覺得老趙對於lambda遞迴有偏見。
先說下老趙這篇文章的由來,我之前也寫過一篇和遞迴有關的隨筆《
由fibonacci數列引出「委託擴充套件」及「遞推遞迴委託」
》,裡面給出了這樣的乙個遞迴定義(以下稱為**一):
public static funcfibonacci = n => n > 1 ? fibonacci(n - 1) + fibonacci(n - 2) : n;
是計算fibonacci數列的,注意上這句**中用了「static」,可以編譯通過,絕對沒有問題!老趙回覆中說不用static無法編譯通過,於是我又給出了以下**(以下稱為**二):
funcfibonacci = null;
fibonacci = n => n > 1 ? fibonacci(n - 1) + fibonacci(n - 2) : n;
**二就是老趙隨筆中開始處的那兩行被稱為「偽」遞迴**,所說的朋友自然就是我了!
呵呵,人家老趙沒說**二是偽遞迴呀。facalies才是呢。並且老趙的希望不是僅僅構造乙個遞迴,而是希望
我的想法是,既然使用「lambda表示式來構造乙個遞迴函式」的難點是因為「我們正在構造的東西是沒有名字的」,因此「我們無法呼叫自身」。那麼,如果我們換種寫法,把我們正在呼叫的匿名函式作為引數傳給自己,那麼不就可以在匿名函式的方法體中,通過呼叫引數來呼叫自身了嗎?
以及從這個出發點開始擴充套件下去的東西
不過結果是james.ying對鶴沖天進行了一些使用il的**,不過問題出在這麼乙個表達上
這樣我們能清楚些,當我們執行委託的時候,會使用invoke(args)來呼叫方法體,看清楚,是invoke方法,並不是委託自己哦,這一點已經偏離了遞迴的概念了。
這是個原則性問題,我的跟帖也就是衝這個去的
其實很多問題根本不需要il來湊熱鬧。
最後,使用最基礎的記憶體堆疊結構概念來解釋老趙的**
回顧基本概念,值型別、引用型別。
funcfac = null;
fac = x => x <= 1 ? 1 : x * fac(x - 1);
funcfacalias = fac;
fac = x => x;
console.writeline(facalias(5)); // 20
第一行,在記憶體中的情況如下
第二行
第三行
第四行
第五行的執行結果自然就是老趙說的:
facalias(5) x <= 1 ? 1 : x * fac(x – 1)
= 5 <= 1 ? 1 : 5 * fac(5 - 1)
= 5 * fac(4) x
= 5 * 4
= 20
所以facalias不是乙個遞迴lambda表示式,因此可以認為是一種「偽遞迴」
而funcfac = null;
fac = x => x <= 1 ? 1 : x * fac(x - 1);
這裡的fac是乙個如假包換的遞迴
最後謝謝各位觀賞
15個磁性材料相關概念解釋(基礎版)
1.磁性 實驗表明任何物質在外磁場中都能夠或多或少地被磁化,只是磁化的程度不同。根據物質在外磁場中表現出的特性,物質可分為五類 順磁性物質,抗磁性物質,鐵磁性物質,亞鐵磁性物質,反鐵磁性物質。我們把順磁性物質和抗磁性物質稱為弱磁性物質,把鐵磁性物質 亞鐵磁性物質稱為強磁性物質。2.磁性材料 軟磁材料...
從多執行緒角度分析QPS TPS等基礎概念
我們在面試的時候基本都會遇到多執行緒方面的問題,常見的資料庫出現 too many connection 如何解決,執行緒池中應該設定多少個執行緒才能滿足系統的需求等等。本篇文章給大家總結一下如何簡單的計算,到底需要多少個執行緒,也希望大家到時候問到多執行緒方面問題的時候,你也能說一下下邊的計算方式...
從入門到精通,Python基礎知識及概念
1.注釋 單行注釋 這是乙個單行注釋 在程式開發時,同樣可以使用 在 的後面 旁邊 增加說明性的文字 但是,需要注意的是,為了保證 的可讀性,注釋和 之間 至少要有 兩個空格 示例 如下 print hello python 輸出 hello python 多行注釋 也可以用三對引號來注釋 如下 注...