伙计们我有关于斐波纳契的问题。如何获得斐波纳契数列,该数字也将以用户输入结束...例如,如果我输出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;
答案 0 :(得分:3)
您的一个错误是在循环逻辑中。
如果用户输入21,您希望斐波那契数字最多为21.您不需要前21个斐波纳契数。
而不是
for (int i = 3; i <= input; i++)
{
////
}
待办事项
while(second <= input)
{
////
}
我的答案几乎肯定有一个一个一个错误,但这应该指向正确的方向。
Fibonacci序列经常被用于技术访谈问题,因为程序员正在努力处理临时变量,特别是在压力下。没有它会更容易:
没有三个变量(first
,second
和third
)。相反,有一个变量:一个包含序列的最后两个元素的数组:
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;
}
将斐波那契逻辑与应用逻辑分开。
运行示例:
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)
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);
}
使用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;
}
您只需要n
或input
答案 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):
如果我们检查代码,您会注意到Maximum是Fibonacci方法的参数,并且我们仅声明2个变量-第一个数字为i,第二个数字为j。
此外,该循环是常规的for循环,而不是while循环,因为while循环还有很多其他示例。这样做的原因很简单-表明您还可以将外部变量与控制变量一起使用来控制循环。
从那里开始,这很简单。第一个数字实例化为0,第二个实例化为1。在循环内部,我们将第二个数字添加到第一个数字,循环将使用该数字递增第二个数字。
最后,最后一个数字被添加到结果中,因为第二个数字大于最大值时循环将退出。
为了在访问期间更好地可视化,请绘制如下表格,并通过不同的迭代填充值:
如果您想进一步测试一下自己,可以使用此示例并将其转换为递归方法。