C#實(shí)現(xiàn)遞歸調(diào)用的Lambda表達(dá)式
前段時(shí)間,我寫一個(gè)樹的訪問算法的時(shí)候,用了Visitor模式把訪問的算法分離了出來,當(dāng)時(shí)打算用lambda表達(dá)式寫visit算法的,卻發(fā)現(xiàn)帶遞歸調(diào)用的lambda表達(dá)式?jīng)]想象的那么好寫,憋了半天愣是沒寫出來,由于當(dāng)時(shí)趕進(jìn)度,就寫成了普通的函數(shù)了。
今天晚上研究了一下遞歸調(diào)用的Lambda表達(dá)式的寫法,發(fā)現(xiàn)也還是比較簡單的,就是腦袋要轉(zhuǎn)個(gè)彎(可能當(dāng)時(shí)這個(gè)彎沒有轉(zhuǎn)過來),首先給一個(gè)簡單的示例:
int i = 1;
RecursiveRun(self =>
{
Console.WriteLine("hello world " + i++);
self();
});
static void RecursiveRun(Action<Action> action)
{
action(() => RecursiveRun(action));
}可能有人說函數(shù)RecursiveRun是無參數(shù)的,基本上沒什么用,下面這個(gè)就是帶一個(gè)參數(shù)的版本了(如果需要更多的參數(shù)的版本,直接把RecursiveRun函數(shù)稍稍修改即可):
static void RecursiveRun<T>(T obj, Action<T, Action<T>> action)
{
action(obj, o => RecursiveRun(o, action));
}通過這個(gè)函數(shù),就可以把二叉樹的遍歷算法用lambda表達(dá)式給表示出來了:
class BinTree
{
public int Value { get; set; }
public BinTree Left { get; set; }
public BinTree Right { get; set; }
public BinTree(int value)
{
this.Value = value;
}
public void Accept(Action<BinTree> visitor)
{
visitor(this);
}
public void Accept(Action<BinTree, Action<BinTree>> visitor)
{
visitor(this, node => node.Accept(visitor));
}
public override string ToString()
{
return Value.ToString();
}
}
var nodes = Enumerable.Range(0, 5).Select(i => new BinTree(i)).ToArray();
nodes[0].Left = nodes[1];
nodes[0].Right = nodes[2];
nodes[1].Left = nodes[3];
nodes[1].Right = nodes[4];
nodes[0].Accept((node, visitor) =>
{
Console.WriteLine(node.Value);
if (node.Left != null)
visitor(node.Left);
if (node.Right != null)
visitor(node.Right);
});以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
unity實(shí)現(xiàn)鼠標(biāo)拖住3D物體
這篇文章主要為大家詳細(xì)介紹了unity實(shí)現(xiàn)鼠標(biāo)拖住3D物體,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-07-07
C#高性能動(dòng)態(tài)獲取對(duì)象屬性值的步驟
這篇文章主要介紹了C#高性能動(dòng)態(tài)獲取對(duì)象屬性值的步驟,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2020-12-12
Unity之跑馬燈抽獎(jiǎng)效果單抽與連抽(附demo)
這篇文章主要介紹了Unity之跑馬燈抽獎(jiǎng)效果單抽與連抽,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05
C#單例模式Singleton的實(shí)現(xiàn)詳解
單例模式(Singleton?Pattern)是日常開發(fā)中最簡單的設(shè)計(jì)模式之一,它提供了一種創(chuàng)建對(duì)象的最佳方式,本文主要為大家介紹的是C#單例模式的實(shí)現(xiàn)方法,需要的可以參考一下2023-05-05
C#函數(shù)式程序設(shè)計(jì)之用閉包封裝數(shù)據(jù)的實(shí)現(xiàn)代碼
如果一個(gè)程序設(shè)計(jì)語言能夠用高階函數(shù)解決問題,則意味著數(shù)據(jù)作用域問題已十分突出。當(dāng)函數(shù)可以當(dāng)成參數(shù)和返回值在函數(shù)之間進(jìn)行傳遞時(shí),編譯器利用閉包擴(kuò)展變量的作用域,以保證隨時(shí)能得到所需要的數(shù)據(jù)2014-03-03
C# 使用PictureBox實(shí)現(xiàn)圖片按鈕控件的示例步驟
這篇文章主要介紹了C# 使用PictureBox實(shí)現(xiàn)圖片按鈕控件的示例步驟,幫助大家更好的理解和使用c#,感興趣的朋友可以了解下2021-02-02
DirectoryEntry配置IIS7出現(xiàn)ADSI Error:未知錯(cuò)誤(0x80005000)
這篇文章主要介紹了DirectoryEntry配置IIS7出現(xiàn)ADSI Error:未知錯(cuò)誤(0x80005000)的解決辦法2015-09-09

