【问题标题】:Fibonacci Series recursive c# method斐波那契数列递归 c# 方法
【发布时间】:2016-02-24 10:21:52
【问题描述】:

我很难编写一个使用递归返回斐波那契数列的方法。

我的迭代方法如下:

public static string Fibonacci(int n)
{

    if (n < 2)
        return "1";
    int[] numbers = new int[n];
    numbers[0]=0;
    numbers[1]=1;
    for (int i = 2; i < n; i++)
    {
        numbers[i] = numbers[i - 1] + numbers[i - 2];

    }
    return string.Join(" ", numbers);
}

我希望将上述方法更改为递归调用,但具有相同的签名,即返回类型是字符串,它返回斐波那契数列,例如 0,1,1,2,3,5,8,13,21,34,55

我在谷歌上搜索过,但在任何地方我都看到它使用 Console.WriteLine() 完成,即值被打印到屏幕上,但没有从函数作为字符串返回。

谢谢

【问题讨论】:

  • WriteLine 是否在计算时打印每个值?您可以修改它以将它们连接到字符串的末尾,然后在最后返回该字符串。
  • 您可以从 0 或 1 开始序列。返回“1”;和数字[0]=0;不匹配。
  • 这里的教训是:使用适当的变量类型。如果事物是​​数字,请将它们放入数字变量(int、double、long、...) - 尤其是,如果您需要对它们进行计算。如果调用者需要一个字符串,他们可以自己调用 .ToString。从数字到字符串(反之亦然)的转换效率低下,应尽可能避免以提高性能和可读性。

标签: c# recursion fibonacci


【解决方案1】:

当然,网络上有很多斐波那契算法的例子,递归的和其他的。自然,递归实现的关键是从递归调用中获取结果,将其与当前结果结合,然后将 that 返回给调用者。

让我们从基本的斐波那契概念开始,使用递归方法,在生成数字时将其写出:

void Fibonacci(int iMinus2, int iMinus1, int count)
{
    if (count == 0) return;

    int current = iMinus2 + iMinus1;

    Console.WriteLine(current);

    Fibonacci(iMinus1, current, count - 1);
}

那么问题是,我们如何调整上面的内容,使其返回string,而不是一次只写一个数字。同样,请记住,关键是始终有办法将当前结果与先前调用的组合结果结合起来。在这种情况下,这意味着我们要将当前数字转换为字符串,并将该字符串添加到递归调用返回的字符串(即当前数字之后的所有数字:

string Fibonacci(int iMinus2, int iMinus1, int count)
{
    if (count == 0) return null;

    int current = iMinus2 + iMinus1;
    string nextNumbers = Fibonacci(iMinus1, current, count - 1);

    return nextNumbers != null ?
        current.ToString() + ", " + nextNumbers : current.ToString();
}

注意:上面的内容比我建议的要复杂一些,因为它可以避免在没有更多下一个数字时添加逗号。还有其他方法可以实现这一点,但我更喜欢实现递归方法,以便终止条件由被调用者而不是调用者处理。

我把它作为练习留给读者处理调用上述内容,以及如何处理短序列(即只查看序列中的第一个或前两个数字的退化情况)。 :)


注意:您的问题听起来很像家庭作业问题。如果是这样:这些在 Stack Overflow 上是合适的,但我不能足够强调 Stack Overflow 不应被视为您老师的替代品。我们很乐意就家庭作业问题提供建议和帮助,但您必须与老师保持关系并向他们寻求建议,以便他们更好地了解您遇到的问题。

【讨论】:

  • 谢谢!只是为了告知,这不是家庭作业问题,我试图理解递归并且在这方面花了很多时间但找不到解决方案。再次感谢。
  • @Rajesh:很高兴我能帮上忙。是的,学习递归一开始可能会让人望而生畏。我一直觉得斐波那契数列是如此经典的递归教学工具很有趣,因为它也是“尾递归”的经典示例,即一种可以轻松转换为迭代算法的递归算法。但我很高兴你发现它有助于指导你学习这个重要的编程领域(我的回答,但主要是一般示例)
猜你喜欢
  • 1970-01-01
  • 2011-07-27
  • 2012-11-19
  • 2016-11-07
  • 2012-02-16
  • 2010-12-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多