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#' 카테고리의 다른 글
C# 메모화(Memoization) (0) | 2024.04.05 |
---|---|
C# 지연 초기화(lazy initialization) (0) | 2024.04.04 |
C# 꼬리 재귀(tail recursion) (0) | 2024.04.01 |
C# for 반복문 작성 시 후위 증가 연산자를 쓰는 이유 (2) | 2024.03.29 |
C# 재귀 호출 동작 방식 (1) | 2024.03.29 |
댓글