Factorial은 n!
으로 표현하며 1부터 n까지의 숫자를 모두 곱하는 것입니다.
n! = 1 * 2 * 3 * .... (n-1) * n
루프를 이용한 구현
간단히 루프를 이용하여 factorial을 구현할 수 있습니다.
아래 코드는 n만큼 루프를 돌고 숫자를 모두 곱해주었습니다.
변수명 acc
는 accumulation의 약자로 축적된 값을 의미합니다
fun factorialLoop(n: Int): Int {
var acc = 1
for (number in 1..n) {
acc *= number
}
return acc
}
println("loop - factorial(10) : ${factorialLoop(10)}" )
# 결과
loop - factorial(10) : 3628800
재귀함수를 이용한 구현
factorial은 재귀로도 구현할 수 있습니다. acc는 축적된 값을 의미하며 1부터 시작합니다.
n번의 계산을 하면 되기 때문에 재귀함수로 factorial
함수가 n번 호출되도록 하였습니다.
계산된 값은 다음 호출로 전달되며 결과를 리턴하게 됩니다.
fun factorial(n: Int, acc: Int): Int {
return if (n <= 0) {
acc
} else {
factorial(n-1, n*acc)
}
}
println("recursion - factorial(10): ${factorial(10, 1)}" )
# 결과
recursion - factorial(10): 3628800
tailrec을 이용하여 성능 개선
tailrec
은 꼬리재귀를 의미하며, 꼬리재귀인 함수에 이 키워드를 붙여주면, 코드가 빌드될 때 루프 형태로 변환됩니다.
즉, 구현은 재귀로 하지만 실제로 동작하는 것은 루프입니다. 재귀함수가 호출될 때마다 스택이 소모되어 성능에 좋지는 않습니다.
재귀로 구현하는 것이 편하신 분은 이 키워드를 사용하는 것이 재귀함수의 성능 문제를 해결할 수 있습니다. 하지만 이 키워드는 꼬리재귀에 대한 것만 가능합니다.
이렇게 키워드를 사용할 수 있습니다.
tailrec fun factorial(n: Int, acc: Int): Int {
return if (n <= 0) {
acc
} else {
factorial(n-1, n*acc)
}
}
tailrec에 대한 자세한 내용은 Kotlin - tailrec(꼬리재귀)에 대해서 알아보기 를 참고해주세요.
Loading script...
Related Posts
- Kotlin - 배열에서 최소 값, 최대 값 찾기
- Kotlin - 2차원 배열 선언, 초기화 방법
- Kotlin - 배열 선언, 초기화 방법
- Kotlin - 리스트, 배열 길이 가져오기
- Kotlin - 리스트에서 최대, 최소 값 찾기
- Kotlin - for 반복문, 배열/리스트 순회
- Kotlin - Timer, 주기적으로 함수 실행
- Kotlin - sleep, 쓰레드 몇 초 지연
- Kotlin - Thread 생성 및 실행
- Kotlin에서 정규표현식 사용하기
- Kotlin - 문자열 길이 계산
- Kotlin - 문자열 비교 방법(equals, ==, compareTo)
- Kotlin - 2개의 배열 하나로 합치기
- Kotlin - 2개의 List 하나로 합치기
- Kotlin - 디렉토리의 모든 파일 리스트 출력
- Kotlin - 리스트 정렬 방법 (sort, sortBy, sortWith)
- Kotlin - 문자열 뒤집기 (Reverse String)
- Kotlin - 랜덤 숫자 생성 (Random, SecureRandom)
- Kotlin - Range, 숫자 범위 표현
- Kotlin - 음수를 양수로 변환, math.abs()
- Kotlin - List를 Set로 변환
- Kotlin - Set를 List로 변환
- Kotlin - 문자열에서 숫자(int)만 추출하는 방법
- Kotlin - Map을 List로 변환하는 방법
- Kotlin - File, Directory가 존재하는지 확인
- Kotlin - List를 Map으로 변환
- Kotlin - List의 중복 요소 제거
- Kotlin - List를 Array로 변환
- Kotlin - 엘비스 연산자 (Elvis Operation)
- Kotlin - Array를 List로 변환
- Kotlin - String을 Float으로 변환
- Kotlin - String을 Double으로 변환
- Kotlin - String을 Int로 변환
- Kotlin - String을 Long으로 변환
- Kotlin - String Null 또는 Empty 체크