Проверить лежат ли в массиве числа Фибоначчи

Всем привет! Имеется массив целых чисел, и мне нужно сделать проверку, соответствуют ли элементы массива числам Фибоначчи. Если соответствуют я делаю Array.Reverse(). Как мне сделать такую проверку?


Ответы (2 шт):

Автор решения: Mical
public static bool FibonacciEquals(int[] row)
{
    for (int i = 0; i < row.Length - 2; i++)
        if (row[i] + row[i + 1] != row[i + 2])
            return false;
    return true;
}

Такой метод работает, даже если ряд начинается не с 0, 1. Но главное, чтобы числа были именно по порядку и без случайных чисел между нужными. То есть, просто ряд фибоначчи.

→ Ссылка
Автор решения: Stanislav Volodarskiy

MakeFibs строит множество всех чисел Фибоначчи, который помещаются в int. AreAllFibs проверяет все числа массива на принадлежность множеству чисел Фибоначчи:

using System;
using System.Collections.Generic;

HashSet<int> MakeFibs() {
    HashSet<int> fibs = new HashSet<int>();
    int a = 0;
    int b = 1;
    fibs.Add(a);
    fibs.Add(b);
    // a + b <= Int32.MaxValue
    while (a <= Int32.MaxValue - b) {
        (a, b) = (b, a + b);
        fibs.Add(b);
    }
    return fibs;
}
HashSet<int> fibs = MakeFibs();

bool AreAllFibs(int[] numbers) {
    foreach (int n in numbers) {
        if (!fibs.Contains(n)) {
            return false;
        }
    }
    return true;
}

Console.WriteLine(AreAllFibs(new int[] {0, 1, 2, 3, 5, 8, 13, 1836311903}));
Console.WriteLine(AreAllFibs(new int[] {0, 1, 2, 3, 5, 8, 13, 33, 1836311903}));
$ csc -nologo fibs.cs && mono fibs.exe
True
False
→ Ссылка