日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

编写递归调用的Lambda表达式

發(fā)布時(shí)間:2025/7/25 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 编写递归调用的Lambda表达式 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前段時(shí)間,我寫一個(gè)樹的訪問(wèn)算法的時(shí)候,用了Visitor模式把訪問(wèn)的算法分離了出來(lái),當(dāng)時(shí)打算用lambda表達(dá)式寫visit算法的,卻發(fā)現(xiàn)帶遞歸調(diào)用的lambda表達(dá)式?jīng)]想象的那么好寫,憋了半天愣是沒(méi)寫出來(lái),由于當(dāng)時(shí)趕進(jìn)度,就寫成了普通的函數(shù)了。

今天晚上研究了一下遞歸調(diào)用的Lambda表達(dá)式的寫法,發(fā)現(xiàn)也還是比較簡(jiǎn)單的,就是腦袋要轉(zhuǎn)個(gè)彎(可能當(dāng)時(shí)這個(gè)彎沒(méi)有轉(zhuǎn)過(guò)來(lái)),首先給一個(gè)簡(jiǎn)單的示例:

??? int i = 1;

??? RecursiveRun(self =>

??????? {

??????????? Console.WriteLine("hello world " + i++);

??????????? self();

??????? });

?

??? static void RecursiveRun(Action<Action> action)

??? {

??????? action(() => RecursiveRun(action));

??? }

可能有人說(shuō)函數(shù)RecursiveRun是無(wú)參數(shù)的,基本上沒(méi)什么用,下面這個(gè)就是帶一個(gè)參數(shù)的版本了(如果需要更多的參數(shù)的版本,直接把RecursiveRun函數(shù)稍稍修改即可):

??? static void RecursiveRun<T>(T obj, Action<T, Action<T>> action)

??? {

??????? action(obj, o => RecursiveRun(o, action));

??? }

通過(guò)這個(gè)函數(shù),就可以把二叉樹的遍歷算法用lambda表達(dá)式給表示出來(lái)了:

??? 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);

??????? });

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/TianFang/archive/2011/08/25/2153793.html

總結(jié)

以上是生活随笔為你收集整理的编写递归调用的Lambda表达式的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。