본문 바로가기
프로그래밍/C#

C# 피보나치 수열 IEnumerable, IEnumerator 상속받아서 구현하기

by bantomak 2024. 4. 4.

C# 피보나치 수열

그동안 재귀로 피보나치 수열은 여러번 구현해봤다. 이번에는 IEnumerable, IEnumerator를 상속받아서 피보나치 수열을 구현해보자.

 

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public partial class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Enumerable Fibo");
        GetFibonacciNumbers(10);
    }

    public static void GetFibonacciNumbers(int totalCount)
    {
        var fb = new FibonacciEnumerable();
        foreach (var item in fb.Take(totalCount)) 
        {
            Console.WriteLine(item);
        }
    }

    public class FibonacciEnumerable : IEnumerable<Int64>
    {
        public FibonacciEnumerable() 
        { }

        public IEnumerator<Int64> GetEnumerator()
        {
            return new FibonacciEnumerator();
        }

        IEnumerator IEnumerable.GetEnumerator() 
        {
            return GetEnumerator();
        }
    }

    public class FibonacciEnumerator : IEnumerator<Int64>
    {
        public FibonacciEnumerator()
        {
            Reset();
        }

        public Int64 Current { get; private set; }
        public Int64 Last { get; set; }

        object IEnumerator.Current
        {
            get
            {
                return Current;
            }
        }

        public bool MoveNext()
        {
            if (Current == -1)
            {
                Current = 0;
            }
            else if (Current == 0) 
            {
                Current = 1;
            }
            else
            {
                var next = Current + Last;
                Last = Current;
                Current = next;
            }

            return true;
        }

        public void Reset()
        {
            Current = -1;
        }

        public void Dispose() 
        {
        }
    }
}

 

C# 기존 재귀로 구현한 피보나치 수열

using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;

public partial class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Recursive Fibo");
        for (int i = -1; i < 9; i++) 
        {
            Console.WriteLine(GetFibonacciRecursive(i));
        }
    }

    public static int GetFibonacciRecursive(int n)
    {
        if (n == -1)
        {
            return 0;
        }
        else if (n == 0)
        {
            return 1;
        }

        return GetFibonacciRecursive(n - 1) + GetFibonacciRecursive(n - 2);
    }
}

 

함께 읽으면 좋은 글

 

C# IEnumerable, IEnumerator에 대해서

IEnumerator 열거자를 구현하는데 필요한 인터페이스, 클래스 내부의 컬렉션에 대해 반복할 수 있도록 도와준다. public interface IEnumerator { object Current { get; } bool MoveNext(); void Reset(); } IEnumerator는 반복

jettstream.tistory.com

댓글