Recursive delegate and state pattern (C# version)

The concept is originated from "Practise StateCharts in C++", where author use member function pointer to represent state pattern.

c# version, more easy to illustrate
/

public delegate MyStateProc MyStateProc(object sender);

MyStateProc StateOpen(object sender)
{
    if (sender.ToString() == "SEND")
        return new MyStateProc(StateSend);
    else
        return new MyStateProc(StateReceive);
}

MyStateProc StateSend(object sender)
{
    MessageBox.Show("Send message: " + sender.ToString());
    return null;
}

MyStateProc StateReceive(object sender)
{
    MessageBox.Show("Receive message: " + sender.ToString());
    return null;
}

private void button1_Click(object sender, System.EventArgs e)
{
    string Flag = "SEND";
    MyStateProc firstState = new MyStateProc(StateOpen);
    MyStateProc nextState = (MyStateProc)
        firstState.Method.Invoke(this, new object[]{Flag});
    nextState.Method.Invoke(this, new object[]{"Hello, delegate!"});
}
C#中,递归是一种函数调用自身的编程技巧。递归算法可以用于解决一些需要重复执行相同操作的问题。 在你提供的引用中,有三个与递归相关的代码片段。让我分别为你解释一下它们。 引用中的代码是一个非递归实现的递归算法。其中使用了一个TreeNode作为数据集类型,替代了T。这段代码使用了一个栈来模拟递归的过程。它首先将根节点添加到栈中,并将其标记为未访问。然后,它进入一个循环,直到栈为空。在循环中,它通过弹出栈顶元素来模拟递归的返回过程。如果当前节点有子节点且未访问过,则将子节点依次添加到栈中,并将当前节点标记为已访问。如果当前节点没有子节点或已经访问过,则将其从栈中弹出,并对其进行一些操作。通过这种方式,非递归实现了递归算法。 引用中的代码是一个使用线程的递归算法。在调用递归的地方,它创建了一个新的线程,并在该线程中调用了DFS()方法。DFS()方法是一个递归方法,其中的递归调用将在新线程中执行。通过这种方式,递归算法可以在独立的线程中运行,从而实现并发执行。 引用中的代码是一个使用LINQ的递归算法。在这段代码中,使用了Directory类的GetFiles()和GetDirectories()方法来获取指定目录下的所有文件和子目录。然后,使用LINQ的ForEach()方法对获取到的文件和子目录进行操作,例如删除文件和递归删除子目录。通过使用LINQ,代码的行数得到了减少,同时也使得代码更加简洁易读。 总结起来,递归是一种函数调用自身的编程技巧,在C#中可以通过不同的方法来实现。非递归实现可以使用栈来模拟递归的过程,使用线程可以实现并发执行的递归算法,使用LINQ可以简化递归操作的代码。具体使用哪种方法取决于具体的问题和需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值