Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- redis 설정
- 예외 전가
- SQL 내장 함수
- Exception Handing
- 특정 행 출력
- 포함 관계
- REST 성숙도 모델
- abstract 제어자
- Port already in use: 9999
- Oracle.DatabaseError
- 예측 범위 내의 요구사항
- 도커
- 쿠버네티스 패턴
- ubuntu redis
- 폐쇄망
- 오프라인 설치
- kafkaCLI
- 객체
- 특정 행
- 의존성 설치
- 자료구조
- apt-rdepends
- 웹 애플리케이션 아키텍처
- 선언적 배포
- 의존성 패키지 설치
- 웹 애플리케이션 요청 흐름
- redis 명령어
- image 압축
- docker
- redis 외부설정
Archives
- Today
- Total
리꾸므
[자료구조] 재귀 함수 본문
재귀함수
자기 자신을 끊임없이 호출하면서 같은 코드가 반복 실행되는 함수
- 장점
- 불필요하게 여러 반복문을 사용하지 않기때문에 코드가 간결해진다.
- 변수를 여러개 사용할 필요가 없다.
- 단점
- 코드의 흐름을 직관적으로 파악하기 어렵다
- 반복 호출하면서 지역변수, 매개변수, 반환값을 process stack에 저장하게 되고 결국 반복문에 비해 메모리를 더 많이 사용하게 된다.
- 메서드 종료이후에 복귀를 위한 컨텍스트 스위칭 비용이 발생한다.
- 사용 조건
- 문제의 크기를 순차적으로 작은 단위로 쪼갤 수 있어야 한다.
- 재귀 호출이 종료되는 시점이 있어야 한다.
- 적합한 상황
- 주어진 문제를 비슷한 구조의 더 작은 문제로 나눌 수 있는 경우
- 중첩된 반복문이 많거나 반복문의 중첩횟수를 예측하기 어려운 경우
- 변경 가능한 상태(mutable state)를 제거하여 프로그램 오류 발생 가능성을 줄이는 경우
재귀적으로 사고하는 법
- 재귀 함수 입력, 출력값 정의
- 어떤 타입을 입력받고, 어떤 타입을 리턴하는지
- 문제를 쪼개고 경우의 수 나누기
- 단순한 문제 해결
- 문제를 여러 경우로 구분한다음 재귀의 기초로서 가장 해결하기 단순한 문제부터 해결한다. 재귀의 기초는 재귀의 탈출 조건을 구성한다.
- 복잡한 문제 해결
- 코드 구현
- 코드는 두 가지 조건으로 이루어진다.
- 재귀 탈출 조건 - 단순한 문제 해결하기 영역
- 재귀 목적 - 복잡한 문제 해결하기 영역
public type recursive(input1, input2, ...) {
// 재귀 탈출 조건 구성(재귀의 기초)
if (문제를 더 이상 쪼갤 수 없을 경우) {
return 단순한 문제의 해답;
}
/*
* 복잡한 문제 해결하기 영역(재귀의 목적)
* head: 배열의 첫 요소
* tail: 배열의 첫 요소만 제거된 배열
*/
return head + arrSum(tail);
return 더 작은 문제로 새롭게 정의된 문제
// 예1. someValue + recursive(input1Changed, input2Changed, ...)
// 예2. someValue * recursive(input1Changed, input2Changed, ...)
}
'발걸음 > 일지' 카테고리의 다른 글
[자료구조]Queue (0) | 2022.11.20 |
---|---|
[자료구조]Stack (0) | 2022.11.20 |
[JAVA] JVM (0) | 2022.11.15 |
[JAVA]Thread (0) | 2022.11.15 |
[JAVA] Stream(feat. Optional<T>) (0) | 2022.11.14 |