2016-12-05 60 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