■ 지연 열거를 사용해 피보나치 수열 구하기
------------------------------------------------------------------------------------------------------------------------
▶ 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 } }
|
------------------------------------------------------------------------------------------------------------------------
'C# > Common' 카테고리의 다른 글
[C#/COMMON] 변환 함수를 사용해 NULL 가능형 구조체 값 변환하기 (0) | 2019.11.24 |
---|---|
[C#/COMMON] yield return 키워드를 사용해 열거 가능형 구하기 (0) | 2019.11.24 |
[C#/COMMON] switch ... case ... 구문에 대응하는 함수형 사용하기 (0) | 2019.11.24 |
[C#/COMMON] 16진수 문자열에서 정수 값 구하기 (0) | 2019.11.24 |
[C#/COMMON] Lazy<T> 클래스 : 지연 초기화(lazy initialization) 사용하기 (0) | 2019.11.23 |
[C#/COMMON] 지연 열거를 사용해 피보나치 수열 구하기 (0) | 2019.11.23 |
[C#/COMMON] 간접 재귀를 사용해 홀짝 여부 구하기 (0) | 2019.11.23 |
[C#/COMMON] 연속 전달형의 꼬리 재귀를 사용해 팩토리얼 구하기 (0) | 2019.11.23 |
[C#/COMMON] 누적기 전달형의 꼬리 재귀를 사용해 팩토리얼 구하기 (0) | 2019.11.23 |
[C#/COMMON] 비동기 프로그래밍 모델(Asynchronous Programming Model, APM) 사용하기 (0) | 2019.11.23 |
[C#/COMMON] ManualResetEvent 클래스 사용하기 (0) | 2019.11.23 |
댓글을 달아 주세요