문제

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;

}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top