Gå til indholdet

N310 yield (Fibonacci)

Skab en tom console-app med to statiske metoder som begge returnerer Fibonacci-numre:

  • IEnumerable<> Fibinacci1(int count)
  • IEnumerable<> Fibonacci2(int count)

Fibonacci-numre beregnes ved at lægge to to forrige numre sammen i en talrække, og er en af de mest facinerende talrækker i matematikken (se WikiPedia).

Hvis man antager at det første nummer er 0 og de næste en ser talrækken således ud:

(0) 1 1 2 3 5 8 13 21 34 55

0+1=1, 1+1=2, 1+2=3, 2+3=5 osv

Du skal altså skabe to metoder. Den første metode Fibinacci1 skal blot skabe en liste af Fibonacci-tal og returnere denne som en IEnumerable. Så kan den løbes igennem som følger:

foreach (var item in Fibonacci1(10))
    Console.WriteLine(item);

Den anden metode Fibinacci2 beregner også numrerne men metoden skal ikke første danne listen og returnere denne, men i stedet returnere et output løbende (yield return) som kan for-each’es. Men kaldet mod metoden er det samme:

foreach (var item in Fibonacci2(10))
    Console.WriteLine(item);
Klik for at se et forslag til en løsning
using System;
using System.Collections.Generic;

namespace samlinger_fibonacci
{
    class Program
    {
        static void Main(string[] args)
        {
            foreach (var item in Fibonacci1(10))
            {
                Console.WriteLine(item);
            }

            foreach (var item in Fibonacci2(10))
            {
                Console.WriteLine(item);
            }

        }

        static IEnumerable<int> Fibonacci1(int count)
        {
            int prevFib1 = 1;
            int currFib1 = 1;
            List<int> lst = new List<int>();
            for (int i = 0; i < count; i++)
            {
                lst.Add(prevFib1);
                int newFib1 = prevFib1 + currFib1;
                prevFib1 = currFib1;
                currFib1 = newFib1;
            }
            return lst;
        }

        static IEnumerable<int> Fibonacci2(int count)
        {
            int prevFib2 = 1;
            int currFib2 = 1;
            for (int i = 0; i < count; i++)
            {
                yield return prevFib2;
                int newFib2 = prevFib2 + currFib2;
                prevFib2 = currFib2;
                currFib2 = newFib2;
            }
        }
    }
}