■ 지연 열거를 사용해 피보나치 수열 구하기

------------------------------------------------------------------------------------------------------------------------

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

    }

}

 

------------------------------------------------------------------------------------------------------------------------

Posted by 사용자 icodebroker
TAG

댓글을 달아 주세요