첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.
본 블로그는 광고를 포함하고 있습니다.
광고 클릭에서 발생하는 수익금은 모두 블로그 콘텐츠 향상을 위해 쓰여집니다.

728x90
반응형
728x170

▶ FibonacciEnumerator.cs

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

namespace TestProject
{
    /// <summary>
    /// 피보나치 수열 열거자
    /// </summary>
    public class FibonacciEnumerator : IEnumerator<long>
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Property
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 현재 값 - Current

        /// <summary>
        /// 현재 값
        /// </summary>
        public long Current { get; private set; }

        #endregion
        #region 현재 값 - IEnumerator.Current

        /// <summary>
        /// 현재 값
        /// </summary>
        object IEnumerator.Current
        {
            get
            {
                return Current;
            }
        }

        #endregion

        ////////////////////////////////////////////////////////////////////////////////////////// Private

        #region 마지막 값 - Last

        /// <summary>
        /// 마지막 값
        /// </summary>
        private long Last { get; set; }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 생성자 - FibonacciEnumerator()

        /// <summary>
        /// 생성자
        /// </summary>
        public FibonacciEnumerator()
        {
            Reset();
        }

        #endregion

        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 다음 항목으로 이동하기 - MoveNext()

        /// <summary>
        /// 다음 항목으로 이동하기
        /// </summary>
        /// <returns>처리 결과</returns>
        public bool MoveNext()
        {
            if(Current == -1)
            {
                // 피보나치 알고리즘 : F0 = 0
                Current = 0;
            }
            else if (Current == 0)
            {
                // 피보나치 알고리즘 : F1 = 1
                Current = 1;
            }
            else
            {
                // 피보나치 알고리즘 : Fn = F(n-1) + F(n-2)
                long next = Current + Last;

                Last    = Current;
                Current = next;
            }

            return true;
        }

        #endregion
        #region 리셋하기 - Reset()

        /// <summary>
        /// 리셋하기
        /// </summary>
        public void Reset()
        {
            Current = -1;
        }

        #endregion
        #region 리소스 해제하기 - Dispose()

        /// <summary>
        /// 리소스 해제하기
        /// </summary>
        public void Dispose()
        {
        }

        #endregion
    }
}

 

▶ FibonacciEnumerable.cs

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

namespace TestProject
{
    /// <summary>
    /// 피보나치 수열 열거 가능형
    /// </summary>
    public class FibonacciEnumerable : IEnumerable<long>
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Public

        #region 열거자 구하기 - GetEnumerator()

        /// <summary>
        /// 열거자 구하기
        /// </summary>
        /// <returns>열거자</returns>
        public IEnumerator<long> GetEnumerator()
        {
            return new FibonacciEnumerator();
        }

        #endregion
        #region 열거자 구하기 - IEnumerable.GetEnumerator()

        /// <summary>
        /// 열거자 구하기
        /// </summary>
        /// <returns>열거자</returns>
        IEnumerator IEnumerable.GetEnumerator()
        {
            return GetEnumerator();
        }

        #endregion
    }
}

 

▶ Program.cs

using System;
using System.Linq;

namespace TestProject
{
    class Program
    {
        //////////////////////////////////////////////////////////////////////////////////////////////////// Method
        ////////////////////////////////////////////////////////////////////////////////////////// Static
        //////////////////////////////////////////////////////////////////////////////// Private

        #region 프로그램 시작하기 - Main()

        /// <summary>
        /// 프로그램 시작하기
        /// </summary>
        private static void Main()
        {
            FibonacciEnumerable fibonacciEnumerable = new FibonacciEnumerable();

            foreach(long value in fibonacciEnumerable.Take(30))
            {
                Console.Write(value);
                Console.Write("\t");
            }

            Console.WriteLine();
        }

        #endregion
    }
}
728x90
반응형
그리드형
Posted by 사용자 icodebroker
TAG , ,

댓글을 달아 주세요