2016-12-05 68 views
2

伙计们我有一个关于斐波那契的问题..我如何得到的斐波那契数列也将结束在用户输入...例如,如果我把21的输出必须是0 1 1 2 3 5 8 13 21如何获得斐波纳契在c#

这是我的代码

static void Main(string[] args) 
    { 

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

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


    } 
+1

您将用户输入转换为'n',而不是'input'。如果你打算为你的循环使用'input',那真的是你想要做的吗? –

回答

2

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

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

不是

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

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

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


斐波那契数列通常用于技术面试问题,因为程序员与临时变量纠缠在一起,特别是在压力下。没有它更容易:

没有三个变量(first,secondthird)。取而代之的是,有一个变量:包含序列的最后两个元素的数组:

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

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

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

谢谢你的回应,先生。它帮助我很多! – jhovyn

+0

谢谢,先生!这是我寻找... – jhovyn

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)); 
    } 
} 
+0

谢谢你的回应先生..我将如何运行此代码?即时通讯仍然是新的在C#对不起,我正在noob .. – jhovyn

+0

我记得在算法课程中检查与你相同的递归解决方案。除非它缓存结果,否则它的表现会非常糟糕(我的意思是非常可怕)。 –

+0

当然会;但性能直到证明才是问题。告诉他缓存和记忆是把马车放在马前。 – 2016-12-05 06:02:58

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

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


做这一切在使用可枚举和lambda表达式的单个表达式。

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; 
     }); 
+1

爱您的(毫不抱歉的放纵)工作。 :-) 而不是'IEnumerable 。所有',也许使用'IEnumerable 。TakeWhile'。然后当超过输入值时它会自动停止。 –

+1

只要一个输入评估为“false”,'All'也会停止。区别在于'TakeWhile'返回一个Enumerable,但'All'返回'boolean'。 – abelenky