ตัวอย่างคลาส Fibonacci

คำนวณค่า Fibonacci แบบไม่ recursive แต่ใช้ IEnumerable เพื่อให้เรียกใช้ด้วย foreach ได้

FibonacciGenerator.cs

using System.Collections.Generic;

namespace ConsoleApp1
{
    class FibonacciGenerator
    {
        private Dictionary<int, int> _cache = new Dictionary<int, int>();

        private int Fib(int n) => n < 2 ? n : FibValue(n - 1) + FibValue(n - 2);

        private int FibValue(int n)
        {
            if (!_cache.ContainsKey(n))
            {
                _cache.Add(n, Fib(n));
            }

            return _cache[n];
        }

        public IEnumerable<int> Generate(int n)
        {
            for (int i = 0; i < n; i++)
            {
                yield return FibValue(i);
            }
        }
    }
}

บรรทัดที่ 7 เก็บ _cache เป็น Dictionary คือเป็น key, value

บรรทัดที่ 9 ถ้าเป็น .Net เวอร์ชันเก่าๆ ให้แก้ฟังก์ชัน Fib() เป็นดังนี้

private int Fib(int n)
{
    return (n < 2) ? n : FibValue(n - 1) + FibValue(n - 2);
}

บรรทัดที่ 21 IEnumerable คือการไล่ (การทำ foreach) ตัวแปรประเภท IEnumerable ก็คือตัวแปรที่สามารถไล่ได้นั่นเอง โดยทุกครั้งที่ไล่ 1 รอบมันจะวิ่งไปจนกว่าจะเจอ yield return อันถัดไป เสริมความเข้าใจเรื่อง IEnumerable/IEnumerator

Program.cs

using System;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            var generator = new FibonacciGenerator();
            foreach (var digit in generator.Generate(15))
            {
                Console.WriteLine(digit);
            }
        }
    }
}

ผลการรัน

> dotnet run
0
1
1
2
3
5
8
13
21
34
55
89
144
233
377