Algorithm
[Algorithm/문해기] 재귀(recursion)_거듭제곱
kimphoby
2022. 9. 15. 18:30
거듭제곱 값을 구하기 위해서는 '재귀함수'를 이용할 수 있다.
그러나 재귀함수에 대한 점화식을 어떻게 작성하는지에 따라 시간복잡도가 크게 달라질 수 있다.
방법 1.
가장 기본적인 아이디어로 n=0 이될 때까지 x값을 반환하는 형태이다.
float power(float x, int n) { if (n == 0) return 1.0; else return x * power(x,n-1); } |
이 방식대로 거듭제곱의 결과를 구한다면, 시간복잡도는 'n' 이된다.
방법 2.
n/2일때의 메모리를 불러와 이용하는 방식.
만약 2**5 을 구하고자 한다면
2**5 = (2**2)*( 2**2 )*2 이고
2**2 = (2**1)*(2**1)이 되므로 5번의 연산을 시행해 주어야 하는 방법1과 달리 2번의 연산과정으로 답을 구할 수 있다.
float power(float x, int n) { float y; if (n == 0) return 1.0; else if (n == 1) return x; else { y = power(x,n/2); if (even(n)) return y * y; else return x * y * y; |
방법2의 시간복잡도는 'logN'이 된다.