Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 可以使用Func<&燃气轮机;递归地调用自己?_C#_.net_Recursion - Fatal编程技术网

C# 可以使用Func<&燃气轮机;递归地调用自己?

C# 可以使用Func<&燃气轮机;递归地调用自己?,c#,.net,recursion,C#,.net,Recursion,我在玩去年出现的一个函数,我拼凑了一个快速递归算法来完成这项工作: static string f(int n, int r) { return "\n".PadLeft(2 * r, '*').PadLeft(n + r) + (r < n ? f(n, ++r) : "*".PadLeft(n)); } 静态字符串f(int n,int r) { 返回“\n”.PadLeft(2*r,'*')。PadLeft(n+r) +(r{ 返回“\n”.PadLeft(

我在玩去年出现的一个函数,我拼凑了一个快速递归算法来完成这项工作:

static string f(int n, int r)
{
    return "\n".PadLeft(2 * r, '*').PadLeft(n + r)
        + (r < n ? f(n, ++r) : "*".PadLeft(n));
}
静态字符串f(int n,int r)
{
返回“\n”.PadLeft(2*r,'*')。PadLeft(n+r)
+(r
我想知道我是否可以用Func做同样的事情:

Func<int,int,string> f = (n, r) => {
    return "\n".PadLeft(2 * r, '*').PadLeft(n + r) 
        + (r < n ? f(n, ++r) : "*".PadLeft(n));
};
Func f=(n,r)=>{
返回“\n”.PadLeft(2*r,'*')。PadLeft(n+r)
+(r
除了递归部分不认识到对f的调用实际上是对自身的调用之外,这可以完成这项工作。这会让我得出这样的结论:Func不能递归地调用自己——但我想知道我是否得出了错误的结论,或者是否可以这样做,但需要一种不同的方法

有什么想法吗?

Func f=null;
Func<int, int, string> f = null;
f = (x, y) => f(x, y);
f=(x,y)=>f(x,y);

很明显,这会导致StackOverflowException,但你明白了。

请参阅关于递归lambda、不动点、Y-组合子等的极客报道。这本书非常有趣。

LOL-我明白了它的要点。但很遗憾,你不能在一行中完成所有的工作。谢谢,很好。Ben的代码是非法的,原因与'inti=i+1;'还要注意的是,f的代码块可以重新分配f的值,这将是迟钝但完全合法的principle@Rob:在您的示例中,
int i=i+1
的值是多少?在我看来,在调用
f=…
时,为“f”分配代码块是合乎逻辑的,但在调用f(n,r)时,它实际上是在调用自己。考虑到f需要被初始化才能执行代码块来调用自身,这在逻辑上是合理的(至少在人的层面上)?