如何在c#中获得斐波那契

时间:2016-12-05 03:36:52

标签: c#

伙计们我有关于斐波纳契的问题。如何获得斐波纳契数列,该数字也将以用户输入结束...例如,如果我输出21,则输出必须为0 1 1 2 3 5 8 13 21

这是我的代码

SELECT id, SUM(flag = 'Y') as count_flag_Y,
       SUM(flag = 'N') as count_flag_N
FROM tablename
GROUP BY id;

5 个答案:

答案 0 :(得分:3)

您的一个错误是在循环逻辑中。

如果用户输入21,您希望斐波那契数字最多为21.您不需要前21个斐波纳契数。

而不是

   for (int i = 3; i <= input; i++)
   {
      ////
   }

待办事项

   while(second <= input)
   {
       ////
   }

我的答案几乎肯定有一个一个一个错误,但这应该指向正确的方向。

Fibonacci序列经常被用于技术访谈问题,因为程序员正在努力处理临时变量,特别是在压力下。没有它会更容易:

没有三个变量(firstsecondthird)。相反,有一个变量:一个包含序列的最后两个元素的数组:

int[] seq = new[] { 0, 1 };

然后,每次你想要移动到下一个数字:

while(seq[1] <= input) 
{
   Console.Write("{0}", seq[1]);    
   seq = new[] { seq[1], seq[0] + seq[1] };
}

答案 1 :(得分:2)

for (int i = 3; i <= input; i++)

表示您将循环input - 3 + 1次;如果输入为21,则您将从3到21运行此循环,包括3和21。

递归:

static int Fib(int n) {
    return (n < 2)? n : Fib(n - 1) + Fib(n - 2);
}

迭代:

static int Fib(int x) {
    if (x == 0) return 0;

    int prev = 0;
    int next = 1;
    for (int i = 1; i < x; i++)
    {
        int sum = prev + next;
        prev = next;
        next = sum;
    }
    return next;
}

将斐波那契逻辑与应用逻辑分开。

运行示例:

http://ideone.com/cNLntC

using System;

public class Test
{
    static int Fib(int n) {
        return (n < 2)? n : Fib(n - 1) + Fib(n - 2);
    }
    public static void Main()
    {
        Console.Write(Fib(10));
    }
}

答案 2 :(得分:2)

使用Binet's Formula

public static void Main()
{
    double root5 = Math.Sqrt(5);
    double phi = (1 + root5) / 2;

    int input;
    Console.Write("Enter a number : ");
    input = Convert.ToInt32(Console.ReadLine());

    Console.Write("Fibonacci numbers to {0}: ", input);

    int n=0;
    int  Fn;
    do
    {
        Fn = (int)((Math.Pow(phi,n) - Math.Pow(-phi, -n)) / (2 * phi - 1 ));
        Console.Write("{0} ", Fn);
        ++n;
    } while(Fn < input);
}

Code Running in IDEOne

使用Enumerables和Lambdas在单个表达式中完成所有操作。

    static void Main(string[] args)
    {
        double root5 = Math.Sqrt(5);
        double phi = (1 + root5) / 2;

        int input;
        Console.Write("Enter a number : ");
        input = Convert.ToInt32(Console.ReadLine());

        Console.Write("Fibonacci numbers to {0}: ", input);

        Enumerable.Range(0, 80).All(n => {
            int f = (int)((Math.Pow(phi, n) - Math.Pow(-phi, -n)) / (2 * phi - 1));
            Console.Write(" " + ((f<input)?f.ToString():""));
            return f < input;
        });

答案 3 :(得分:0)

int first = 0, second = 1, third = 0;
        Console.Write("Enter a number : ");
        var n = Convert.ToInt32(Console.ReadLine());
        Console.Write("First {0} Fibonacci numbers {1} {2} ", n, first, second);

        for (int i = 3; i <= n; i++)
        {
            third = first + second;
            Console.Write("{0} ", third);
            first = second;
            second = third;
        }

您只需要ninput

答案 4 :(得分:0)

这个问题已经很老了,但是对于程序员进行面试可能很有用,所以去:

如其他一些答案所述,您的变量太多。另外,您希望将业务逻辑与GUI分开-这样可以在面试中为您评分。

请参考以下代码:

static void Main(string[] args)
{
  Console.Write("Enter a maximum number for the Fibonacci sequence: ");
  Console.WriteLine(Fibonacci(Convert.ToInt32(Console.ReadLine())));
  Console.WriteLine("Press any key to quit.");
  Console.ReadKey();
}

static string Fibonacci(int max)
{
  int i = 0;
  StringBuilder result = new StringBuilder();

  for (int j = 1; j <= max; j += i)
  {
    result.Append(string.Format("{0} {1} ", i, j));
    i += j;
  }

  if (i <= max)
    result.Append(i);

  return result.ToString();
}

在Main方法中,我们处理所有UI逻辑,在Fibonacci方法中,我们处理对调用代码的输出字符串的生成。以下是代码的结果,最大为21(或33):

Fibonacci Result

如果我们检查代码,您会注意到Maximum是Fibonacci方法的参数,并且我们仅声明2个变量-第一个数字为i,第二个数字为j。

此外,该循环是常规的for循环,而不是while循环,因为while循环还有很多其他示例。这样做的原因很简单-表明您还可以将外部变量与控制变量一起使用来控制循环。

从那里开始,这很简单。第一个数字实例化为0,第二个实例化为1。在循环内部,我们将第二个数字添加到第一个数字,循环将使用该数字递增第二个数字。

最后,最后一个数字被添加到结果中,因为第二个数字大于最大值时循环将退出。

为了在访问期间更好地可视化,请绘制如下表格,并通过不同的迭代填充值:

Manual interview debug

如果您想进一步测试一下自己,可以使用此示例并将其转换为递归方法。