본문 바로가기

프로그래밍/알고리즘

순환(Recursion)에 대해(2)

순환적으로 사고하기 (Recursive Thinking)

- 순환은 수학 함수 계산뿐 아니라 다른 많은 문제들을 해결할 때 도움을 줄 수 있는 사고 방식이다.


문자열의 길이 계산

- 슈도 코드

if the string is empty

return 0;

else

return 1 plus the length of the string that excludes the first character;

//원래 문자열에서 첫 번째 문자를 뺀 길이를 계산하여 거기에 1을 더한다.


- 구현

public static int length (String str) {

if (str.equals(""))

return 0;

else

return 1 + length(str.substring(1));

//substring(1)은 원래 있던 문자열에서 제일 앞 문자를 제거한 나머지 문자열을 만드는 역할을 한다.

}


- 입력받은 문자열을 순환을 이용해 출력하기

public static void printChars (String str) {

if (str.length() == 0)

return;

else { //제일 앞 글자를 출력한 후 해당 글자를 지우며 다시 printChar함수를 불러온다.

System.out.print(str.charAt(0));

printChars(str.substring(1));

}

}


- 문자열을 뒤집어서 출력하기

public static void printCharsReverse (String str) {

if (str.length() == 0)

return;

else { //순환함수와 출력이 뒤집어져있어 결과적으로 뒤에서부터 글자가 출력된다.

printCharsReverse(str.substring(1));

System.out.print(str.charAt(0));

}

}


- 2진수로 변환 후 출력

public void printInBinary (int n) {

if (n < 2)

System.out.print(n);

else { //n을 2로 나눈 몫을 먼저 2진수로 변환해 반환한 후 n을 2로 나눈 나머지를 출력한다.

printInBinary(n / 2);

System.out.print(n % 2);

}

}


- 배열의 합 구하기

public static int arraySum (int n, int[] data) {

if (n <= 0)

return 0;

else //data의 인덱스를 n - 1씩 불러옴으로써 indexOutOfBoundException을 방지할 수 있다.

return sum(n - 1, data) + data[n - 1]; 

}


- 데이터파일로부터 n개의 정수 읽어오기

//Scanner in이 참조하는 파일로부터 n개의 정수를 입력받아 배열 data의 data[0] ~ data[n - 1]에 저장하게 된다.

public void readFrom (int n, int[] data, Scanner in) {

if (n == 0)

return;

else {

readFrom (n - 1, data, in);

data[n - 1] = in.nextInt();

}

}


Recursion vs Iteration

- 모든 순환함수는 반복문(iteration)으로 변경이 가능하다.

- 그 역 또한 성립하여 모든 반복문은 recursion으로 표현 가능하다.

- 순환함수는 복잡한 알고리즘을 단순하고 알기 쉽게 표현할 수 있도록 만들어준다.

- 표현이 쉬운 반면 함수 호출에 따른 오버헤드가 있다는 단점이 있다. (매개변수 전달, 엑티베이션 프레임 생성 등)

'프로그래밍 > 알고리즘' 카테고리의 다른 글

Recursion 응용(2)  (0) 2019.05.12
Recursion 응용(1)  (0) 2019.05.10
순환(Recursion)에 대해(3)  (0) 2019.05.09
순환(Recursion)에 대해(1)  (0) 2019.05.08
시간복잡도에 대해  (1) 2019.05.07