C# fibonacci 기능 반환 오류
-
21-08-2019 - |
문제
C# 콘솔 응용 프로그램을 연습하고 있으며, 숫자가 Fibonacci 시리즈에 나타나는지 여부를 확인하기 위해 함수를 얻으려고하지만 오류가 발생합니다.
내가 한 일은 :
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;
}
}
나는 실제로 이런 종류의 Fibonacci 구현 대 전통 재귀 솔루션을 정말 좋아합니다. 왜냐하면 그것은 다음을 완료하는 데 사용 가능한 용어를 완성하는 데 사용되기 때문입니다. 전통적인 재귀 솔루션은 각 용어마다 두 개의 재귀 호출이 필요하기 때문에 일부 작업을 복제합니다.
문제는 <= 다음 진술에 있습니다.
for (int i = 2; i <= 100; i++)
지점까지 더 많은 =. FIB [100] (C# Zero Counts)가 없으므로 i = 100을 확인하면 예외가 발생합니다.
적절한 진술이어야합니다
for (int i = 2; i < 100; i++)
또는 더 나은
for (int i = 2; i < fib.Length; i++)
글쎄, 초보자에게는 배열이 10 개 밖에 걸리지 않으며 ~ 100 개의 항목 (범위 외지 외상)으로 채우고 있지만 더 좋은 방법이 있습니다 ...
예를 들어, 사용 이 게시물:
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++)
그리고 배열을 더 크게 만들지 만 Marc가 말했듯이 더 좋은 방법이 있으며, Wikipedia 기사를 읽는 데 시간을 보내는 것이 좋습니다. 피보나치 번호.
당신이 할 수있는 한 가지는 일찍 출구를 점검하는 것입니다. 주어진 숫자가 Fibonacci 시퀀스에 있는지 확인하려고하므로 일찍 종료하기 위해 경계 확인을 수행 할 수 있습니다.
예시:
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;
}