[알고리즘] 순환(Recursion)의 개념과 기본 예제 2

2023. 6. 8. 16:11·Programming/Algorithm
인프런 무료 강의 권오흠교수님 '영리한 프로그래밍을 위한 알고리즘 강좌' 보면서 공부한 내용입니다.
부족한 내용이나 잘못된 내용은 댓글남겨주시면 감사하겠습니다!

출처 : https://inf.run/iezc

 

지난 시간에 이어 순환함수를 공부하였다.

2023.06.08 - [알고리즘] - [알고리즘] 순환(Recursion)의 개념과 기본 예제 1

 

오늘은 문자열을 출력하는 함수들을 만들어보았는데, 먼저 문자열의 길이를 계산하는 함수이다.

/*
 * 순환(Recursion)의 개념과 기본 예제 2-01
 * 문자열의 길이 계산 
 * 1) 1+ length("bc") : 1 + 2 = 3 
 * 2) 1+ length("c") : 1 + 1
 * 3) 1+ length("") : 1 + 0
 * -> 3
 */
package edu.recursion;

public class Recursion02_01 {
	public static void main(String[] args) {
		int result = length("abc");
		System.out.println(result);
	}
	
	public static int length(String str){
		if(str.equals(""))
			return 0;
		else
			// str.substring(1) : 문자열에서 앞의 문자를 제거하고 다시 문자열을 만듦
			return 1+length(str.substring(1));
	}
}

str.substring(1) 함수를 이용하여 문자열의 맨 첫글자를 제외하고 다시 문자열을 만든다.

그렇게 위에 주석처럼 반복을 하다보면 문자열의 길이를 구할 수 있는 간단한 함수이다.

 

다음은 문자열을 프린트 해주는 함수인데, 이번에도 substring함수를 이용하였다.

/*
 * 순환(Recursion)의 개념과 기본 예제 2-02
 * 문자열의 프린트
 * -> a
 * 	  b
 * 	  c
 */
package edu.recursion;

public class Recursion02_02 {
	public static void main(String[] args) {
		printChars("abc");
	}
	
	public static void printChars(String str){
		if(str.length() ==0) // 문자열의 길이가 0이라면 출력할 게 없음
			return;
		else{
			// 문자열의 첫 글자 출력 후 나머지 문자열을 담아서 함수 다시 실행 
			System.out.println(str.charAt(0));
			// str.substring(1) : 문자열에서 앞의 문자를 제거하고 다시 문자열을 만듦
			printChars(str.substring(1));
		}
	}
}

 

이번엔 순환함수랑 출력부분을 바꿔서 문자열을 뒤집에서 출력하는 함수이다.

/*
 * 순환(Recursion)의 개념과 기본 예제 2-03
 * 문자열을 뒤집어 프린트
 * -> c
 * 	  b
 * 	  a
 * 
 * 첫 글자를 제외한 문자열을 뒤집어 프린트 한 후 마지막으로 첫 글자를 프린트
 */
package edu.recursion;

public class Recursion02_03 {
	public static void main(String[] args) {
		printCharsReverse("abc");
	}
	
	public static void printCharsReverse(String str){
		if(str.length() ==0) // 문자열의 길이가 0이라면 출력할 게 없음
			return;
		else{
			printCharsReverse(str.substring(1));
			System.out.println(str.charAt(0));
		}
	}
}

 

그리고 다음은 2의 몫과 나머지를 구해서 10진수를 2진수로 변환하는 함수이다. 

/*
 * 순환(Recursion)의 개념과 기본 예제 2-04
 * 2진수로 변환하여 출력
 * -> 1010
 * 
 * 음이 아닌 정수 n을 이진수로 변환하여 인쇄
 * 
 */
package edu.recursion;

public class Recursion02_04 {
	public static void main(String[] args) {
		printInBinary(10);
	}
	
	public static void printInBinary(int n){
		if(n < 2)
			System.out.print(n); // n을 2로 나눈 몫을 먼저 2진수로 변환하여 인쇄한 후
		else{
			printInBinary(n/2);
			
			// 마지막비트는 n을 2로 나눴을 때와 같음, 즉 짝수 : 0, 홀수 : 1
			System.out.print(n%2); // n을 2로 나눈 나머지를 인쇄
		}
	}
}

 

그리고 이전 포스팅했던 순환함수 중 유사한 배열의 합 구하는 함수이다.

/*
 * 순환(Recursion)의 개념과 기본 예제 2-05
 * 배열의 합 구하기
 * -> 15
 * 
 * data[0]에서 data[n-1]까지의 합을 구하여 반환
 * 
 */
package edu.recursion;

public class Recursion02_05 {
	public static void main(String[] args) {
		int[] arr = {1, 2, 3, 4, 5};
		int result = sum(arr.length, arr);
		System.out.println(result);
	}
	
	// n : 배열의 개수, data : 배열
	public static int sum(int n, int[] data){
		if(n <= 0)
			return 0;
		else{
			return sum(n-1, data) + data[n-1];
		}
	}
}

 

그리고 마지막은 스캐너를 이용하여 정수를 읽어 오는 함수인데, 이것은 실제론 잘 사용하지 않는다고 한다.

이렇게도 쓸 수 있다. 알아만 두자!

/*
 * 순환(Recursion)의 개념과 기본 예제 2-06
 * 데이터파일로부터 n개의 정수 읽어오기
 * 잘 사용하지는 않음. 이렇게 할 수도 있다 정도만!
 * 
 * Scanner in이 참조하는 파일로부터 n개의 정수를 입력받아 배열 data의 data[0], ..., data[n-1]에 저장
 * 
 */
package edu.recursion;

import java.util.Scanner;

public class Recursion02_06 {
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		int size = 3;
		int[] arr = new int[size];
		readFrom(size, arr, in);
	}
	
	// n : 배열의 개수, data : 배열
	public static void readFrom(int n, int[] data, Scanner in){
		if(n == 0)
			return ;
		else{
			readFrom(n-1, data, in);
			data[n-1] = in.nextInt();
		}
	}
}

 


 모든 순환함수는 반복문(iteration)으로 변경 가능
 그 역도 성립. 즉 모든 반복문은 recursion으로 표현 가능
 순환함수는 복잡한 알고리즘을 단순하고 알기쉽게 표현하는 것을 가능하게 함
 하지만 함수 호출에 따른 오버해드가 있음
 (매개변수 전달, 액티베이션 프레임 생성 등)
 

'Programming > Algorithm' 카테고리의 다른 글

[알고리즘] Recursion의 응용 : N-Queens  (0) 2023.06.15
[알고리즘] Recursion의 응용 - Counting Cells in a Blob  (0) 2023.06.14
[알고리즘] Recursion의 응용 - 미로 찾기  (0) 2023.06.13
[알고리즘] 순환(Recursion)의 개념과 기본 예제 3  (0) 2023.06.09
[알고리즘] 순환(Recursion)의 개념과 기본 예제 1  (0) 2023.06.08
'Programming/Algorithm' 카테고리의 다른 글
  • [알고리즘] Recursion의 응용 - Counting Cells in a Blob
  • [알고리즘] Recursion의 응용 - 미로 찾기
  • [알고리즘] 순환(Recursion)의 개념과 기본 예제 3
  • [알고리즘] 순환(Recursion)의 개념과 기본 예제 1
min_sol
min_sol
  • min_sol
    비글개발연구소🐾
    min_sol
  • 전체
    오늘
    어제
    • 분류 전체보기 (278)
      • Programming (128)
        • Algorithm (52)
        • JAVA (40)
        • GIS (5)
        • PyQt (10)
        • C# (11)
        • Mobile (6)
        • AI (4)
      • Backend (36)
        • Spring (14)
        • JSP (11)
        • Network (5)
      • Frontend (29)
        • React (11)
        • Vue (13)
        • Next.js (4)
      • Database (10)
        • PostgreSQL (1)
        • Oracle (8)
        • Elasticsearch (1)
      • DevOps (8)
        • Linux (7)
        • Mac (1)
      • Tools (31)
        • IntelliJ (1)
        • GitHub (10)
        • RPA (20)
      • Security (9)
      • etc (21)
        • ERROR (5)
        • 세미나 | 교육 (10)
        • 자격증 (1)
        • 일상 (2)
        • 2021 (2)
  • 인기 글

  • 태그

    백준
    vue.js
    이클립스
    VUE
    알고리즘
    PyQt5
    생능출판
    계산기
    자동화
    자료구조
    spring
    코딩테스트
    PyQt
    자바
    Java
    연습문제
    jsp
    스윙
    RPA
    명품자바에센셜
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
min_sol
[알고리즘] 순환(Recursion)의 개념과 기본 예제 2
상단으로

티스토리툴바