在Lambda表达式中进行递归调用
示例代码:
class Test
{
/**//// <summary>
///
/// </summary>
/// <param name="v1"></param>
/// <param name="v2"></param>
/// <param name="num"></param>
/// <param name="total"></param>
/// <returns></returns>
public delegate long AddMethod(long v1, long v2, int num, int cout);
/**//// <summary>
///
/// </summary>
/// <param name="addMethod"></param>
/// <param name="cout"></param>
static void Print(AddMethod method, int cout)
{
Console.WriteLine(method(0, 1, 2, cout));
}
static void Main()
{
//求0,1,1,2,3,5,8.类似的数据队列在第30个位置的数
Print((v1, v2, num, cout) =>
{
Console.Write(v1);
Console.Write(",");
num++;
if (num == cout)
{
Console.Write(v2);
Console.WriteLine();
return v1 + v2;
}
else
{
//取得当前方法
StackFrame frame = new StackFrame(0);
//递归调用
return (long)(frame.GetMethod().Invoke(num, new object[] { v2, (v1 + v2), num, cout }));
}
}, 30);
Console.Read();
}
}
我们的代码成功运行了,成功的求出在第30个位置的数值是:514229
其时,.NET里还有一个东东可以方便的得到当前调用方法的引用,这东东就是MethodBase,其有一个静态方法GetCurrentMethod 可直接获取当前执行的方法引用,所以我们可以将上面的StackFrame处的两句代码改为如下:
//递归调用
return (long)(MethodBase.GetCurrentMethod().Invoke(num, new object[] { v2, (v1 + v2), num, cout }));
执行后的结果都是一样的(不一样才怪了Orz)