TIL-JAVA 재귀

DY_DEV·2023년 3월 14일
0

TIL

목록 보기
8/17

3월 14일 재귀학습 정리.

  • 자바 인텔리제이 사용시 주소값이 출력되는 문제: toString()메소드 사용으로 해결

재귀함수 사용조건

  • 문제의 크기를 점점 작은 단위로 쪼갤 수 있어야 합니다.
  • 재귀 호출이 종료되는 시점이 존재해야 합니다.

재귀함수 사용 flow

  • 입출력 값을 단순하거나 추상적으로 정의한다.
  • 주어진 입력값에 따라 경우의 수를 나누고 더 나눌수 있는 경우와 없는 경우를 구분한다.
  • 가장 해결하기 쉬운 문제(=재귀의 기초, base case)부터 해결. base case = 탈출조건
  • 배열을 head와 tail(나머지 부분)으로 구분하는 방법 등을 통해 재귀적으로 복잡한 문제를 해결한다.

재귀를 통해 배열의 길이를 구하는 문제

Arrays.copyOfRange()

question: Arrays.copyOfRange()를 통해 배열의 요소를 차감하면서 재귀를 진행하는데, 분명 from 1 -> 인덱스 1부터 새로운 배열을 만들지만, 배열의 요소가 하나 남은 경우도 연산이 진행되는 이유를 모르겠다.

  • 디버깅 모드를 사용해보자


-길이가 1인 [3] 배열이 전달되었다. 해당 배열이 copyOfRange 메소드로 전달 되었을 때, copyOfRange의 시작조건(인덱스)이 1부터라고 명시되어있으므로 해당 연산에서 오류가 날 것 같다고 생각했다. 하지만 결과는 빈 배열이 출력되었다. 이유가 뭘까? 구글을 아무리 찾아봐도 함수 내부의 자세한 연산은 나오지 않아 IntelliJ에서 직접 검색을 했다.


배열의 길이는 시작위치와 끝 위치의 차로 결정되고있다. [3] 배열을 original로 전달했을때, from=1, to= arr.length = 1 의 값이 들어간다. 그 아래 newLength를 보면 from과 to의 차이가 할당된다. 예외처리는 음수가 아니기때문에 넘어가고,

int[] copy = new int[newLength]
= 배열의 길이가 0인 배열이 생성된다 = 빈 배열 생성

아래 arraycopy 연산은 [3] 배열을 새로 만든 copy 배열로 복사하는 과정이고, Math.min 조건에서 min 내부의 두 값들이 모두 0으로 동일하다. 따라서 "copy 배열의 0부터 0위치까지 복사"라는 연산 실행시 아무것도 복사하지 않는 빈 배열이 출력된다.

System.arraycopy( Object src, int srcPos, Object dest, int destPos, int length )

  • Object src: Ctrl+C 할 곳 (복사하려는 원본)
  • int srcPos: Object src의 몇 번째 인덱스부터 복사할 것인지
  • Object dest: Ctrl+V 할 곳 (붙여넣기하려는 대상)
  • int destPos: Object dest의 몇 번째 인덱스부터 붙여넣기할 것인지
  • int length: Object src에서 몇 개를 복사할 것인지 (해당 문제의 경우 min 값이 동일하므로 0번째 인덱스 부터 0번째 인덱스 까지 복사= 아무것도 복사하지 않는 빈 배열이 출력된다. )

https://unit-15.tistory.com/13

0개의 댓글