编写递归调用的Lambda表达式
前段時(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)題。
- 上一篇: 4、安装rz/sz
- 下一篇: deb和rmp的安装