【问题标题】:Can a Func<> call itself recursively?Func<> 可以递归调用自己吗?
【发布时间】:2009-11-20 15:36:48
【问题描述】:

我在玩去年出现的code golf question yesterday for building a christmas tree,我拼凑了一个快速递归算法来完成这项工作:

static string f(int n, int r)
{
    return "\n".PadLeft(2 * r, '*').PadLeft(n + r)
        + (r < n ? f(n, ++r) : "*".PadLeft(n));
}

我想知道我是否可以用 Func 做同样的事情:

Func<int,int,string> f = (n, r) => {
    return "\n".PadLeft(2 * r, '*').PadLeft(n + r) 
        + (r < n ? f(n, ++r) : "*".PadLeft(n));
};

这个完成这项工作,只是递归部分不承认对 f 的调用实际上是对自身的调用。这会让我得出结论,Func 不能递归地调用自己 - 但我想知道我是否得出错误的结论,或者它是否可以完成但需要不同的方法。

有什么想法吗?

【问题讨论】:

标签: c# .net recursion


【解决方案1】:
Func<int, int, string> f = null;
f = (x, y) => f(x, y);

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

【讨论】:

  • 哈哈——我明白了。太糟糕了,您不能在一行中完成所有操作。谢谢。
  • 正确。 Ben 的代码是非法的,原因与 'int i = i + 1;' 相同另请注意,f 的代码块可以重新分配 f 的值,这将是钝的但完全合法。
  • 是的 - 不要写这个确切的代码,但它原则上回答了问题
  • @Rob:在您的示例int i = i + 1 的情况下,“未初始化”+ 1 的值是多少?在我看来,在调用f = ... 时为“f”分配代码块似乎是合乎逻辑的,但在调用 f(n, r) 时它实际上会调用自己。考虑到 f 需要被初始化才能让正在执行的代码块调用自身,所以这在逻辑上是可行的(至少在人类层面上)。
  • 我在这里描述这是错误的原因:blogs.msdn.com/ericlippert/archive/2006/08/18/…
【解决方案2】:

请参阅this 了解递归 lambda、固定点、Y 组合器等的非常令人讨厌的内容。非常有趣的阅读。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-22
    • 1970-01-01
    • 2014-03-02
    • 2022-06-25
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多