본문 바로가기

프로그래밍/C#101

C# 피보나치 수열 IEnumerable, IEnumerator 상속받아서 구현하기 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 FibonacciEnum.. 2024. 4. 4.
C# 꼬리 재귀(tail recursion) 꼬리 재귀(tail recursion)란 무엇인가? 지금까지 재귀에 대해서 설명하면 GetFactorial() 메서드를 사용해서 계승을 계산하는 전통적인 재귀 형태를 사용했다. 이 방식은 재귀 호출을 먼저 수행하고 값을 반환하며, 이후에 결과를 계산한다. 이 재귀 모델을 이용하는 경우, 재귀 호출이 끝날 때까지 결과를 얻을 수 없다. 이 같은 전통적인 재귀 모델과 더불어 꼬리 재귀(tail recursion)라는 또 다른 형태가 있다. 꼬리 재귀에서는 꼬리 즉, 마지막 재귀 호출이 함수가 수행하는 마지막 작업이다. using System; public partial class Program { static void Main(string[] args) { TailCall(5); } public static.. 2024. 4. 1.
C# for 반복문 작성 시 후위 증가 연산자를 쓰는 이유 평상시 쓰던 for 반복문 지금까지 너무나도 당연하게 작성하고 있는 for 반복문 하지만 갑자기 의문이 들었다. 왜 for 반복문에서 증감연산자는 후위 증가연산자를 사용하는가? using System; public partial class Program { static void Main(string[] args) { int[] ints = { 8, 10, 24, -1, 98, 47, -101, 39 }; for (int i = 0; i < ints.Length; i++) { Console.WriteLine(ints[i]); } } } for 반복문의 경우 (초기화 ; 조건 검사 ; 증감 연산)과 같이 각각이 별도의 연산으로 증감 연산에서 전위 후위에 관계없이 동일한 결과를 도출한다. i++, ++i 어느.. 2024. 3. 29.
C# 재귀 호출 동작 방식 재귀 호출에 대해 재귀(recursion) 함수란 자신을 호출하는 함수를 말하는데, while이나 for와 같은 순환처럼 재귀 함수도 하나씩 작은 부분을 처리한 결과를 결합해 하나의 복잡한 문제를 해결해 나가는 방법이다. 하지만 for나 while은 작업이 끝날 때까지 반복을 계속하는 반면, 재귀호출은 작업 자체를 잘게 쪼개서 처리한 결과를 결합하는 방법으로 더 큰 문제를 해결한다는 차이가 있다. 반복에 비해 재귀가 더 짧게 구현 가능한 경우가 많기 때문에 함수형 접근 방식에 적합하지만, 설계와 테스트는 더 어려운 편이다. 재귀 호출로 코드를 더 짧게 구현 가능 설계와 테스트 난이도가 올라감 using System; public partial class Program { static void Main(s.. 2024. 3. 29.
C# string에서 16진수로 변환하기 string에서 16진수로 변환하기 string에서 16진수로 변환하기 위해서는 우선 각각의 string을 한글자씩 char 요소로 분해해서 이를 바이트로 출력하면 된다. 이때 바이트로 변환되는 값은 10진수이다. public static byte[] ConvertToByte(string str) { byte[] bytes = new byte[str.Length]; int i = 0; foreach (char c in str) { bytes[i++] = Convert.ToByte(c); } return bytes; } 전체 예제 코드 using System; public partial class Program { static void Main(string[] args) { int i = 0; string.. 2024. 3. 28.
식 트리와 람다식 식 트리(expression tree) 람다를 이용하면 식의 요소들을 트리로 표현하는 데이터 구조인 식 트리(expression tree)를 만드는 것도 가능하다. 식 트리를 이용하면, 트리를 따라가며 해석하거나 특정 노드를 수정해서 코드에 변화를 줄 수 있다. 컴파일러 측면에서는 식 트리를 추상 구문 트리(abstract syntax tree, AST)라고 부른다. 대리자에 람다식을 할당하는 코드를 살펴보자. private static Func AreaREctangleDelegate = (a, b) => a * b; 이 문은 다음 세 구역으로 나눈다. 대리자 변수 선언 : Func AreaRectangleDelegate 대입(할당) 연산자 : = 람다식 : (a, b) => a* b 이제 이 문을 데이.. 2024. 3. 27.