C#の色の機能に戻誤差
-
21-08-2019 - |
質問
I am練習、C#コンソール-アプリケーションの、のような機能になる場合には番号が表示されるフィボナッチ数列のレビューは参考になりまようになっています。
なかった:
class Program
{
static void Main(string[] args)
{
System.Console.WriteLine(isFibonacci(20));
}
static int isFibonacci(int n)
{
int[] fib = new int[100];
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i <= 100; i++)
{
fib[i] = fib[i - 1] + fib[i - 2];
if (n == fib[i])
{
return 1;
}
}
return 0;
}
}
誰でも教えてなぜですか。
解決
ここではシングソリューションビートすべてのお客様次第!
では、なぜ 繰り返し きいスマート 数学者 っ 閉鎖解 ですか?:)
static bool IsFibonacci(int number)
{
//Uses a closed form solution for the fibonacci number calculation.
//http://en.wikipedia.org/wiki/Fibonacci_number#Closed-form_expression
double fi = (1 + Math.Sqrt(5)) / 2.0; //Golden ratio
int n = (int) Math.Floor(Math.Log(number * Math.Sqrt(5) + 0.5, fi)); //Find's the index (n) of the given number in the fibonacci sequence
int actualFibonacciNumber = (int)Math.Floor(Math.Pow(fi, n) / Math.Sqrt(5) + 0.5); //Finds the actual number corresponding to given index (n)
return actualFibonacciNumber == number;
}
他のヒント
ここで無限反復子ブロックを使用して、楽しいソリューションです。
IEnumerable<int> Fibonacci()
{
int n1 = 0;
int n2 = 1;
yield return 1;
while (true)
{
int n = n1 + n2;
n1 = n2;
n2 = n;
yield return n;
}
}
bool isFibonacci(int n)
{
foreach (int f in Fibonacci())
{
if (f > n) return false;
if (f == n) return true;
}
}
私は実際本当に伝統再帰的なソリューション対フィボナッチ実装のこの種のように、それは次を完了するために利用できる用語を完了するために使用される作業を続けているため。それは各学期2回の再帰呼び出しを必要とするため、従来の再帰的な解決策は、いくつかの作業を複製します。
問題が<=次の文にあります:
for (int i = 2; i <= 100; i++)
=点以上。何のFIBを使用すると、I = 100にチェックインしたときので、あなたが例外を取得[100](C#ゼロカウント)はありません。
適切な文がなければなりません。
for (int i = 2; i < 100; i++)
またはより良い。
for (int i = 2; i < fib.Length; i++)
まあ、初心者のためのあなたの配列はわずか10の長さで、あなたは(範囲外の例外)〜100のアイテムとそれを充填している - しかし、これを行うには良い方法があります...
例えば、をhref="https://stackoverflow.com/questions/406446/refactoring-fibonacci-algorithm/406448#406448">使用
long val = ...
bool isFib = Fibonacci().TakeWhile(x => x <= val).Last() == val;
int[] fib = new int[10];
for (int i = 2; i <= *100*; i++)
いつもまわりにいる範囲外の配列でのループ条件が大きすぎます。従来のアプローチする結合によるループの配列サイズ:
for (int i = 2; i < fib.Length; i++)
おもてなしには配列の大きなものとしてマークと、より良いめんなさい、と私はお時間の読み込みに関するwikipedia記事 フィボナッチ数列.
あなたができることの一つは、早期終了のためのチェックです。あなたが与えられた数はフィボナッチ数列であるかどうかを判断しようとしているので、あなたは境界が早期に終了するチェックを行うことができます。
例:
static bool isFibonacci(int n)
{
int[] fib = new int[100];
fib[0] = 1;
fib[1] = 1;
for (int i = 2; i <= fib.Length; i++)
{
fib[i] = fib[i - 1] + fib[i - 2];
if (n == fib[i])
{
return true;
}
else if (n < fib[i])
{
return false; //your number has been surpassed in the fib seq
}
}
return false;
}
public static int FibNo(int n) {
int result = 0; int No = 0; int N1 = 1;
if (n< 0)
{ throw new ArguementException("number must be a positive value"); }
if (n <= 1)
{ result = n; return result; }
for(int x=1; x < n; x++)
{ result = No + N1; No = N1; N1=result; }
return result;
}