재귀함수

OneTwoThree·2023년 7월 5일

알고리즘

목록 보기
16/22

재귀함수

  • 자기 자신을 호출하는 함수
  • 스택 프레임
  • 복귀 라인을 기억해놓음
  • if - else 형식으로 탈출조건 작성하기

피보나치

import java.util.*;
public class Main {

    static int[] fibo;

    //num이 항의 번호
    public static int recursive(int num){
        if (num==1) return fibo[num]=1;
        else if (num==2) return fibo[num]=1;
        else {
            return fibo[num] = recursive(num-2)+recursive(num-1);
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int input = in.nextInt();
        //성능을 올리기 위해 배열 사용
        fibo = new int[input+1];
        recursive(input);
        for (int i=1;i<=input; i++){
            System.out.print(fibo[i]+" ");
        }


    }


}
  • 이렇게 배열을 사용해서 성능을 최적화 할 수 있음
import java.util.*;
public class Main {

    static int[] fibo;

    //num이 항의 번호
    public static int recursive(int num){
        if (fibo[num]!=0) return fibo[num];
        if (num==1) return fibo[num]=1;
        else if (num==2) return fibo[num]=1;
        else {
            return fibo[num] = recursive(num-2)+recursive(num-1);
        }
    }

    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int input = in.nextInt();
        //성능을 올리기 위해 배열 사용
        fibo = new int[input+1];
        recursive(input);
        for (int i=1;i<=input; i++){
            System.out.print(fibo[i]+" ");
        }


    }


}
  • 더해서 메모이제이션을 사용하면 훨씬 빨라짐
  • 값을 기록해놓고 기록한 것을 사용
  • 재귀 호출이 훨씬 적어짐

0개의 댓글