编写递归调用的Lambda表达式
前段時間,我寫一個樹的訪問算法的時候,用了Visitor模式把訪問的算法分離了出來,當時打算用lambda表達式寫visit算法的,卻發現帶遞歸調用的lambda表達式沒想象的那么好寫,憋了半天愣是沒寫出來,由于當時趕進度,就寫成了普通的函數了。
今天晚上研究了一下遞歸調用的Lambda表達式的寫法,發現也還是比較簡單的,就是腦袋要轉個彎(可能當時這個彎沒有轉過來),首先給一個簡單的示例:
??? int i = 1;
??? RecursiveRun(self =>
??????? {
??????????? Console.WriteLine("hello world " + i++);
??????????? self();
??????? });
?
??? static void RecursiveRun(Action<Action> action)
??? {
??????? action(() => RecursiveRun(action));
??? }
可能有人說函數RecursiveRun是無參數的,基本上沒什么用,下面這個就是帶一個參數的版本了(如果需要更多的參數的版本,直接把RecursiveRun函數稍稍修改即可):
??? static void RecursiveRun<T>(T obj, Action<T, Action<T>> action)
??? {
??????? action(obj, o => RecursiveRun(o, action));
??? }
通過這個函數,就可以把二叉樹的遍歷算法用lambda表達式給表示出來了:
??? 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);
??????? });
?
?
轉載于:https://www.cnblogs.com/TianFang/archive/2011/08/25/2153793.html
總結
以上是生活随笔為你收集整理的编写递归调用的Lambda表达式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 4、安装rz/sz
- 下一篇: deb和rmp的安装