使用Lambda实现递归

递归描述

fn(n)

if(n ==1) return 1
return n * f(n-1)

当然上面的n我们假定为不为零的正整数

在lambda语言中无法直接表示,请看

            Func<int, int> fn = n =>
{
if (n == 1)
return 1;
else
return fn(n - 1) * n;
};

看上去不错。可惜不能运行。因为 return fn(n - 1) * n; 中的fn使用前没有定义。fn在它代表lambda表达示之前是没有办法使用的。

如果写成这样的伪码呢

lambda fn = n => (n==1)?1: n * self(n-1)

看起来不错。但是self怎么来呢,干脆做参数传进来。写成下面伪码

lambda fn = n, self => (n==1)?1: n * self(n-1)

好像是可以。用c#实现看看。

            Func<object, int, int> fn = (p, n) =>
{
var fnx = p as Func<object, int, int>;
if (n == 1)
{
return 1;
}
else
{
return fnx(p, n - 1) * n;
}
};

可以啦。由于c#不是动态语言,所以有一个转换。

原文地址:https://www.cnblogs.com/goodspeed/p/2222372.html