Search
Duplicate

순환 (Recursion) 의 개념과 기본 예제 2

태그
순환
Recursion
알고리즘
문자열의 길이를 계산하기 위해서 for 문 이나 while 문을 사용할 것이다. 하지만 순환적 사고를 통해 다음과 같은 방식을 사용할 수도 있다.
if the string is empty
return 0;
else
return 1 plus the length of the string that excludes the first character;
이를 코드로 표현하면 다음과 같다.
public static int length(String str) { if (str.equals("")) return 0; else return 1 + length(str.substring(1)); }
Java
복사
str.substring(1)
str 문자열에서 첫번째 문자열을 뺀 나머지 문자열을 말한다.
문자열의 프린트
public static void printChars(String str) { if (str.length() == 0) return; else { System.out.print(str.charAt(0)); printChars(str.substring(1)); } }
Java
복사
문자열을 뒤집어 프린트
문자열을 뒤집어 프린트 하고 싶다면 먼저 첫번째 문자열을 제외한 나머지 부분을 뒤집어 프린트 한 후, 마지막으로 첫 글자를 프린트하면 된다.
public static void printCharsReverse(String str) { if (str.length() == 0) return; else { printCharsReverse(str.substring(1)); System.out.print(str.charAt(0)); } }
Java
복사
2진수로 변환하여 출력
음이 아닌 정수 n 을 이진수로 변환하여 인쇄하려면, n 을 2로 나눈 몫을 먼저 2 진수로 변환하여 인쇄한 후 n 을 2로 나눈 나머지를 인쇄한다.
public void printInBinary(int n) { if (n < 2) System.out.print(n); else { printInBinary(n/2); System.out.print(n%2); } }
Java
복사
배열의 합 구하기
data[0] 에서 data[n-1] 까지의 합을 구하여 반환한다.
public static int sum(int n, int [] data) { if (n <= 0) return 0; else return sum(n-1, data) + data[n-1]; }
Java
복사
데이터 파일로부터 n 개의 정수 읽어오기
Scanner in 이 참조하는 파일로부터 n개의 정수를 입력받아 배열 data의 data[0], …, data[n-1] 에 저장한다. (쓰는 경우 거의X)
public void readFrom (int n, int [] data, Scanner in) { if (n==0) return; else { readFrom(n-1, data, in); data[n-1] = in.nextInt(); } }
Java
복사
Recursion VS. Iteration
모든 순환함수는 반복문(iteration) 으로 변경 가능하다. 물론 그 역도 성립한다. 순환함수는 복잡한 알고리즘을 단순하고 알기쉽게 표현하는 것을 가능하게 한다. 하지만 함수 호출에 따른 오버해드가 있다. (매개변수 전달, 액티베이션 프레임 생성 등)