computer_study

Recursion 본문

알고리즘/개념정리

Recursion

knowable 2020. 7. 7. 17:34

1. 기본 개념

  • 간단하게 재귀함수를 뜻한다.
  • 하지만 수학함수 계산에만 유용한 것이 아니다.
  • 자기 자신을 재 참조하는 방법을 말한다.
  • 모든 recursion은 반복문으로 변경 가능하고, 그 역도 성립한다.
  • recursion은 복잡한 알고리즘을 단순하고 알기 쉽게 표현하지만 함수 호출에 따른 오버헤드가 있다.

 

2. 문제풀이 시 중요한 부분

  • 기저부분(base case)와 순환부분(recursive case)를 나누어 생각해야된다.
  • 기저를 먼저 생각해본다.

 

 

3. 예시

  • 펙토리얼 함수
#include <iostream>

using namespace std;

int fac(int n){
    if(n == 1)
        return 1;
    else
        return n * fac(n-1);
}

int main(){
    int result;
    result = fac(5);
    cout << result << endl;
}

'5!'를 출력하는 코드

 

 

  • 피보나치 수열 (n번째 수열의 값 구하기)
#include <iostream>
using namespace std;

int fibo(int n){
    
    if( n < 0){ // exception
        cout << "please put positive integer" << endl;
        return -1;
    }
    
    if( n < 2 )
        return n;
    
    else
        return fibo(n-2) + fibo(n-1);
}

int main(){
    int result,n;
    cin >> n;
    
    result = fibo(n-1);
    cout << result << endl;
}

n을 입력받아 n번째 피보나치수열의 값을 출력하는 코드

 

 

 

  • 두 수의 최대공약수 구하기
※ Euclid Method

 1. a≥b인 두 양의 정수 a와 b에 대해서 a가 b의 배수이면 gcd(a , b) = b이고, 그렇지 않으면 gcd(a,b) = gcd(b , a%b)
 2. gcd(a , b)   =     a            (b가 0이라면)
                 = gcd(b , a%b)     (b가 0이 아니라면)
#include <iostream>
using namespace std;

int gcd(int a, int b){
    if(a < b){
        int tmp;
        tmp = a;
        a = b;
        b= tmp;
    }
    if(a % b == 0){
        return b;
    }
    else{
        return gcd(b, a%b);
    }
    
}

int main(){
    int result,a,b;
    cin >> a >> b;
    
    result = gcd(a,b);
    cout << result << endl;
}

숫자 a.b (무조건 양수라 가정) 를 입력받아 최대공약수를 출력하는 코드

 

  • 문자열의 길이 계산

string을 지나가며 비어있지 않으면 1을 더하고 다음 부분을 확인

  • 문자열의 프린트

길이 계산할 때 처럼 string을 지나가며 하나씩 출력.(출력 뒤에 recursion들어간다.)

  • 문자열을 뒤집어 프린트

recursion으로 먼저 들어간 뒤에 출력 (앞 문자열 프린트와 반대로 출력)

 

 

 

4. 강의 내용 정리

순환의 개념과 기본 예제 1:  excelsior-cjh.tistory.com/28
 

Recursion의 개념과 기본 예제들

1. Recursion - 순환 또는 재귀함수라고 부른다. - 메소드를 정의할 때 자기 자신을 재참조 하는 방법을 말한다. 1) 무한루프가 발생하는 경우 : 아래의 코드는 func() 라는 메소드를 아무런 조건없이 ��

excelsior-cjh.tistory.com

순환의 개념과 기본 예제 2: https://excelsior-cjh.tistory.com/29?category=922441
 

Recursion의 개념과 기본 예제들 - 2

1. 문자열의 길이 계산 1) Base Case : 문자열 값이 null 인 경우 → return 0; 2) Recursive Case : 첫번째 문자를 제외한 길이 + 1을 return 한다. public class RecursionTest { public static void main(Stri..

excelsior-cjh.tistory.com

순환의 개념과 기본 예제 3:
 

Recursion의 개념과 기본 예제들 - 3

1. 순환 알고리즘의 설계 (Designing Recursion) 적어도 하나의 base case, 즉 순환되지 않고 종료되는 case가 있어야 한다. 모든 case는 결국 base case로 수렴해야 한다. 암시적(implicit) 매개변수를 명시적(ex..

excelsior-cjh.tistory.com

 

Comments