Возвращая N-е число Фибоначчи, последовательность?

У меня есть вопрос о моей домашней работе для класса, и мне нужно знать, как вернуть n-е число последовательности Фибоначчи, используя итерацию (рекурсия не допускается).

Мне нужно несколько советов о том, как это сделать, чтобы я мог лучше понять, что я делаю неправильно. Я вывожу на консоль в моем program.cs, следовательно, он отсутствует в коде ниже.

    // Q1)
    //
    // Return the Nth Fibonacci number in the sequence
    //
    // Input: uint n (which number to get)
    // Output: The nth fibonacci number
    //

    public static UInt64 GetNthFibonacciNumber(uint n)
    {

    // Return the nth fibonacci number based on n.


    if (n == 0 || n == 1)
        {
            return 1;
        }

        // The basic Fibonacci sequence is 
        // 1, 1, 2, 3, 5, 8, 13, 21, 34...
        // f(0) = 1
        // f(1) = 1
        // f(n) = f(n-1) + f(n-2)
        ///////////////
        //my code is below this comment

        uint a = 0;
        uint b = 1;

        for (uint i = 0; i < n; i++)
        {
            n = b + a;
            a = b;
            b = n;
        }
        return n;
 Shmiddty22 окт. 2012 г., 21:23
вы не должны изменятьn в вашем для цикла.
 NullUserException22 окт. 2012 г., 21:26
@ user1766351 Мы все были там. Или, по крайней мере, большинство из нас.
 user176635122 окт. 2012 г., 21:25
вау, я чувствую себя глупым спасибо, новичок в программировании
 Servy22 окт. 2012 г., 21:32
Вы должны дать своим переменным более значимые имена, а не a, b, n и т. Д. Это поможет смягчить подобные проблемы.
 harold22 окт. 2012 г., 21:22
Вы используете повторноn, Это делает условие цикла неправильным после первой итерации.

Ответы на вопрос(8)

    public IEnumerable<BigInteger> FibonacciBig(int maxn)
    {
        BigInteger Fn=1;
        BigInteger Fn_1=1;
        BigInteger Fn_2=1;

        yield return Fn;
        yield return Fn;

        for (int i = 3; i < maxn; i++)
        {
            Fn = Fn_1 + Fn_2;

            yield return Fn;

            Fn_2 = Fn_1;
            Fn_1 = Fn;
        }


    }

Вы можете получить n-й номер по

   FibonacciBig(100000).Skip(n).First();

списком Фибоначчи и некоторыми расширениями IEnumerable

public IEnumerable<int> Fibonacci(){
   var current = 1;
   var b = 0;
   while(true){
       var next = current + b;
       yield return next;
       b = current;
       current = next;
   }
}

public T Nth<T>(this IEnumerable<T> seq, int n){
    return seq.Skip.(n-1).First();
}

Получение n-го числа будет тогда

Fibonacci().Nth(n);

Я думаю, что это должно сработать:

    uint a = 0;
    uint b = 1;
    uint c = 1;

    for (uint i = 0; i < n; i++)
    {
        c = b + a;
        a = b;
        b = c;
    }
    return c;
 Shmiddty22 окт. 2012 г., 21:36
Или я должен начать с 2?
 Shmiddty22 окт. 2012 г., 21:34
Почему бы тогда не начать с 1? Он уже получил улов для 0 и 1
 Nabou22 окт. 2012 г., 21:36
тогда он может убрать защелки :)
 Nabou22 окт. 2012 г., 21:31
это делает fib (1) = 2. Я думаю, что вы должны изменить a на 0 и c = 1. Таким образом, fib (0) = c = 1, fib (1) по-прежнему равен 1, а fib (2) = 2, что, на мой взгляд, является правильной последовательностью.

вы должны начать с 3, потому что у вас уже есть числа для f1 и f2 (первые два числа). Обратите внимание, что нет смысла получать 0-е число Фибоначчи.

public static UInt64 GetNthFibonacciNumber(uint n)
    {

    // Return the nth fibonacci number based on n.


if (n == 1 || n == 2)
    {
        return 1;
    }


    uint a = 1;
    uint b = 1;
    uint c;

    for (uint i = 3; i <= n; i++)
    {
        c = b + a;
        a = b;
        b = c;
    }
    return c;

}

 public static List<int> PrintFibonacci(int number)
        {
            List<int> result = new List<int>();
            if (number == 0)
            {
                result.Add(0);
                return result;
            }
            else if (number == 1)
            {
                result.Add(0);
                return result;
            }
            else if (number == 2)
            {
                result.AddRange(new List<int>() { 0, 1 });
                return result;
            }
            else
            {
                //if we got thus far,we should have f1,f2 and f3 as fibonacci numbers
                int f1 = 0,
                    f2 = 1;

                result.AddRange(new List<int>() { f1, f2 });
                for (int i = 2; i < number; i++)
                {
                    result.Add(result[i - 1] + result[i - 2]);
                }
            }
            return result;

        }
        public static int GetNthFibonacci(int n)
    {
        var previous = -1;
        var current = 1;
        int index = 1;
        int element = 0;

        while (index++ <= n)
        {
            element = previous + current;
            previous = current;
            current = element;
        }

        return element;
    }

:)

static ulong Fib(int n) 
{
    double sqrt5 = Math.    double p1 = (1 + sqrt5) / 2;
    double p2 = -1 * (p1 - 1);


    double n1 = Math.Pow(p1, n + 1);
    double n2 = Math.Pow(p2, n + 1);
    return (ulong)((n1 - n2) / sqrt5);
}
 L.B22 окт. 2012 г., 22:03
@ Я знаю, я написал это для развлечения.
 pmcilreavy09 дек. 2015 г., 23:10
это начинает разрушаться, когда числа становятся больше и возвращает неправильные результаты.
 Thom Smith22 окт. 2012 г., 22:21
Кроме того,n2/sqrt5 всегда будет <0,5, так что вы можете опустить его и округлить.
 Emile22 окт. 2012 г., 22:02
Хорошее решение, но ОП сказал, что программа должна использовать итерацию, так что это не подходит. К сожалению ;-)
 NullUserException22 окт. 2012 г., 22:41
Почему это работает:en.wikipedia.org/wiki/...
    public static UInt64 GetNthFibonacciNumber(uint n)
    {
        if (n == 0 || n == 1)
        {
            return 1;
        }
        UInt64 a = 1, b = 1;
        uint i = 2;
        while (i <= n)
        {
            if (a > b) b += a;
            else a += b;
            ++i;
        }
        return (a > b) ? a : b;
    }

Ваш ответ на вопрос