質問

で誰かが示すことができなかったため再帰的lambda式トラバースツリー構造のC#.

役に立ちましたか?

解決

Okを見渡したとき、自由な時間でした。
舞台裏について語ってくれた:

class TreeNode
{
    public string Value { get; set;}
    public List<TreeNode> Nodes { get; set;}


    public TreeNode()
    {
        Nodes = new List<TreeNode>();
    }
}

Action<TreeNode> traverse = null;

traverse = (n) => { Console.WriteLine(n.Value); n.Nodes.ForEach(traverse);};

var root = new TreeNode { Value = "Root" };
root.Nodes.Add(new TreeNode { Value = "ChildA"} );
root.Nodes[0].Nodes.Add(new TreeNode { Value = "ChildA1" });
root.Nodes[0].Nodes.Add(new TreeNode { Value = "ChildA2" });
root.Nodes.Add(new TreeNode { Value = "ChildB"} );
root.Nodes[1].Nodes.Add(new TreeNode { Value = "ChildB1" });
root.Nodes[1].Nodes.Add(new TreeNode { Value = "ChildB2" });

traverse(root);

他のヒント

正解はこの慣用的解決に多くのプログラミング言語の使用 定点combinator.このように:固定小数点トcombinatorという問いに対する答え"どうやって定義匿名機能する再帰的?".でも、ソリューションがで自明でないと全体の執筆を説明します。

簡単な、実用的にインタビューを受けたことがある"戻る時間"のが大変臨機応変かつ、慎重なC:宣言の前に定義で設定します。次のことを試してみてください("要因"機能):

Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);

作品のような魅力です。

または、プツリーのフォーカストラバーサルオブジェクトのクラス TreeNode を実装する IEnumerable<TreeNode> を適切に行い、その子ども

Action<TreeNode, Action<TreeNode>> preorderTraverse = null;
preorderTraverse = (node, action) => {
    action(node);
    foreach (var child in node) preorderTraverse(child, action);
};

単純にインタビューを受けたことがある"戻る時間"のが大変臨機応変かつ、慎重なのCおよびC++:宣言の前に定義で設定します。次のことを試してみてください:

Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);

作品のような魅力です。

あり、それは、さすがに調度品等は古くなっ点に注意してください。C#は可変です。いないようにする誤っていて思ったこと。

Func<int, int> fact = null;
fact = x => (x == 0) ? 1 : x * fact(x - 1);

// Make a new reference to the factorial function
Func<int, int> myFact = fact;

// Use the new reference to calculate the factorial of 4
myFact(4); // returns 24

// Modify the old reference
fact = x => x;

// Again, use the new reference to calculate
myFact(4); // returns 12

もちろん、この例では、逆に、この利用時の変更可能な参照です。ご利用の場合はcombinatorsから アク'sリンクこん可能です。

を想定して神話のオブジェクトTreeItem、conatins子供コレクションは上位の階層となります。

    public void HandleTreeItems(Action<TreeItem> item, TreeItem parent)
    {
        if (parent.Children.Count > 0)
        {
            foreach (TreeItem ti in parent.Children)
            {
                HandleTreeItems(item, ti);
            }
        }

        item(parent);
    }

今はそれを呼び出すように、過は、ラムダ取り扱う一つの項目で、印刷にその名前です。

HandleTreeItems(item => { Console.WriteLine(item.Name); }, TreeItemRoot);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top