递归描述
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#不是动态语言,所以有一个转换。