본문 바로가기

Language/Kotlin34

Kotlin에서의 꼬리 재귀와 피보나치 수열 재귀는 함수가 자신을 다시 호출하는 프로그래밍 패턴입니다. Kotlin에서는 꼬리 재귀(tail recursion) 최적화를 지원하는데, 이것이 바로 tailrec 키워드의 역할입니다. 그렇다면 꼬리 재귀 최적화를 활용하여 피보나치 수열을 어떻게 구현할 수 있을까요? 이 문제를 해결하기 위해 아래와 같은 코드를 작성해 보았습니다. // Recursion/Fibonacci.kt package recursion import atomictest.eq fun fibonacci(n: Int): Long { // 내부에서 사용할 꼬리 재귀 함수를 정의합니다. tailrec fun fibonacci( n: Int, // 남은 재귀 호출 횟수 current: Long, // 현재 피보나치 수 next: Long // .. 2023. 8. 29.
Kotlin에서의 tailrec 이해하기 재귀는 함수가 자기 자신을 호출하는 방식입니다. 그러나 재귀를 과도하게 사용하면 스택 오버플로우와 같은 문제에 직면할 수 있습니다. Kotlin은 이 문제를 해결하기 위한 강력한 키워드, tailrec을 제공합니다. 재귀와 스택 먼저 기본적인 CS 관점에서 보면, 프로그램은 함수 호출을 스택 메모리에 저장합니다. 일반적인 재귀 호출마다 새로운 스택 프레임이 추가됩니다. 이러한 스택 프레임이 너무 많아지면, 스택 오버플로우가 발생합니다. Tail Recursion과 tailrec Tail Recursion은 재귀의 특별한 형태입니다. 함수의 마지막 연산이 자기 자신의 호출인 경우를 의미합니다. 이러한 특징 덕분에 컴파일러나 인터프리터는 재귀 호출을 반복문처럼 최적화할 수 있습니다. Kotlin에서 tail.. 2023. 8. 29.
코틀린의 fold()와 foldRight() fold()와 foldRight()는 Kotlin의 표준 라이브러리에 있는 강력한 함수로, 리스트나 다른 컬렉션의 요소를 누적하는 데 사용됩니다. 이 글에서는 두 함수의 기능과 차이점을 탐색하겠습니다. fold(): fold() 함수는 주어진 초기값부터 시작하여 컬렉션의 각 요소를 순차적으로 처리합니다. 구조: fold(initialValue: R, operation: (acc: R, T) -> R): R 파라미터: initialValue: 누적 작업을 시작하는데 사용되는 초기 값입니다. operation: 각 요소에 적용되는 연산. 여기서: acc: 누적값 (accumulator) T: 현재 리스트의 요소 (current element) foldRight(): foldRight()는 fold()와 동작.. 2023. 8. 29.
Kotlin의 `it` 키워드 Kotlin은 개발자의 편의를 위해 많은 문법적인 특성들을 제공하고 있습니다. 그 중 하나가 람다 표현식에서 사용되는 it 키워드입니다. it이란? 람다 표현식은 종종 한 개의 파라미터만을 받아 처리하는 경우가 많습니다. Kotlin에서는 이런 경우에 파라미터 이름을 별도로 지정하지 않고, 대신에 it이라는 암시적 이름을 사용할 수 있게 했습니다. it의 장점 간결성: 코드가 더 간결해져서 람다의 본질적인 목적에 집중할 수 있습니다. 가독성: 일관된 it 사용으로 코드의 가독성이 향상될 수 있습니다. 예시 시나리오 우리는 주어진 숫자 리스트에서 모든 짝수를 찾고 싶습니다. it 없이 처리: val numbers = listOf(1, 2, 3, 4, 5, 6) val evens = numbers.filte.. 2023. 8. 29.