從基礎概念解釋「偽」遞迴

2022-01-17 00:31:37 字數 2605 閱讀 2825

起因 老趙

使用lambda表示式編寫遞迴函式

經過 鶴沖天

反駁老趙之「偽」遞迴

結果 james.ying

駁「反駁老趙之「偽」遞迴」

摘要:老趙提了個「偽」遞迴的說法

funcfac = null;

fac = x => x <= 1 ? 1 : x * fac(x - 1);

console.writeline(fac(5)); // 120;

funcfacalias = fac;

fac = x => x;

console.writeline(facalias(5)); // 20

第一次列印出的120是正確的結果。不過facalias從fac那裡「接過」了使用lambda表示式構造的委託物件之後,我們讓fac引用指向了新的匿名方法x => x。於是facalias在呼叫時:

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 多行注釋 也可以用三對引號來注釋 如下 注...