2016-12-05 2 views
2

皆フィボナッチに関する質問があります。フィボナッチシリーズを取得するにはどうすればいいですか?フィボナッチをCで取得する方法#

この3 5 8 13 21 2は、あなたのエラーの

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

ユーザー入力は 'input'ではなく' n'になります。それはあなたのループに 'input'を使うことを計画しているなら、本当にあなたがしたいことですか? –

答えて

2

一つがループロジックである私のコードです。

ユーザが21を入力すると、フィボナッチ数は21になります。最初の21フィボナッチ数は必要ありません。

よりもむしろ

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

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

私の答えは、ほぼ確実にoff-by-oneエラーを持っていますが、これは正しい方向にあなたを指している必要があります。


フィボナッチシーケンスは、技術面接の質問によく使用されます。プログラマは、特にプレッシャー下で一時変数に苦労するためです。それがなければ簡単です:

3つの変数(first,secondおよびthird)がありません。 、その後、あなたは次の番号に移動したいたびに

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

:シーケンスの最後の2つの要素を含む配列:代わりに、一つの変数を持っている

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; 
} 

アプリケーション・ロジックからあなたのフィボナッチ・ロジックを分離します。

実行例:Binet's Formula使用

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#で​​新しいです。私の就職活動のために申し訳ありません。 – jhovyn

+0

Algorithmsコースであなたと同じ再帰的なソリューションを検討しました。結果がキャッシュされない限り、それはひどく実行されます(そして、私は本当にひどいことを意味します)。 –

+0

それはもちろんです。パフォーマンスは実証されるまで問題にはなりません。キャッシングとメモについて彼に話すと、馬の前にカートが置かれています。 –

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

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); 
} 
Code Running in IDEOne


Enumerablesとラムダを使用して単一の式でそれをすべて行います。

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 .All'ではなく、おそらく' IEnumerable .TakeWhile'を使用します。その後、入力値を超えると自動的に停止することができます。 –

+1

'All'も1つの入力が' false'と評価されるとすぐに停止します。違いは 'TakeWhile'はEnumerableを返しますが、' All'は 'boolean'を返します。 – abelenky

関連する問題