재귀 피보나치 수열의 경우는 어떻게 하나요?
345
작성한 질문수 57
3번 반복하는 for문안에 함수가있어서 3^n이 된거같은데
피보나치처럼
return f(n-1) + f(n - 2)같은 경우는 어떻게 하나요?
함수 하나당 리턴쪽에 함수 호출이2번있으니까
2^n인가요?
답변 1
0
네 정확합니다. :)
0
함수 호출횟수 ^ n이라고 뭔가 딱 생각하고 말기에는 그러면 이전에강의에나왔던
int sum = go + go 이부분에서도 함수호출이 2번이니까 2^n이어야 되는게 아닌가요?
go에 들어가는 인자의 값이 반씩 줄어서 다르게 생각해야한다라고하기엔 피보나치도 뭔가 인자로 들어가는 값이 하나씩 줄고있는데 둘이 시간복잡도가 갈리는 이유가뭔가용?
0
확인했습니다. ㅎㅎ 함수호출이 2번이면 보통은 2 ^ n이 나옵니다.
Q3 같은 경우 그런 걸 아는 사람들을 위해 꼰 문제라고 보시면 되는데요. 저 문제는 해당 범위는 딱 한번만 출력이 됩니다. 즉, 중복되는 범위가 없습니다. 그렇기 때문에 함수 호출이 많이 줄어든 것입니다.
좀 더 자세히 얘기해볼까요?
저 문제의 함수를 보면
자, n이 16일 때
1, 2, 4, 8, 16 이런식으로 호출이 되죠?
1, 2, 4, 8을 모두 더하면? 15가 됩니다. 그렇기 때문에 2 *n >> O(n)의 시간복잡도를 가집니다.
#include<bits/stdc++.h>
using namespace std;
int n, a[1004], cnt;
int go(int l, int r){
cout << l << " : " << r << '\n';
cnt++;
if(l == r) return a[l];
int mid = (l + r) / 2;
int sum = go(l, mid) + go(mid + 1, r);
return sum;
}
int main(){
cin >> n;
for(int i = 1; i <= n; i++){
a[i - 1] = i;
}
int sum = go(0, n - 1);
cout << sum << '\n';
cout << cnt << '\n';
}
근데 피보나치는 왜 그게 안되냐면. 일단 go(n - 1)부터 시작해서.... go(1)까지 호출이 되죠? n번
go(n - 2) 또한 .....go(1)까지 호출이 되죠? n번, 범위도 중복이 되기 때문에 더 많이 호출이 됩니다. go하나당 이런게 2번씩.. 2번씩 되면서 그 해당 함수는 n번... 그래서 2 ^ n이 됩니다.
보통의 재귀함수는 go(n - 1) 또는 go(idx + 1) 이라는 구조를 가지기 때문에 보통은 2 ^ n이라고 보시면 되지만 Q3도 생각하실 부분이 있는것이죠.
또한 해당 부분은 강의 설명에 보완설명 넣어 놓겠습니다.
감사합니다.
1-E질문입니다!
0
518
2
3-L 틀린 부분 피드백 부탁드립니다.
0
821
2
1-A문제 순열재귀함수 질문입니다.
0
384
1
1-A 일곱난쟁이문제입니다
0
456
1
문제 풀 때 방향성에 대해
0
801
1
맥에서 vs code로 실행 관련 질문입니다
0
523
1
17071번 메모리 초과
0
386
1
1-C질문입니다!
0
421
2
2-B BFS 시간초과질문
0
630
2
1-O 13번 라인
0
442
1
6-J 놀이공원 문제 질문
0
381
1
구현관련 질문
0
484
1
강의 교안
0
319
1
실력을 더 올리고나서 강의를 보는 것이 맞을까요?
0
545
1
안녕하세요! 재귀함수에 관해서 질문드립니다
0
536
1
1-K
0
473
2
3-G번 질문있습니다.
1
473
3
3-C 실행 시간 질문드립니다.
0
494
1
4-A 문제 풀이 질문있습니다.
0
590
2
비트마스킹 연산자 "1의 보수" 영문 표기법
0
435
1
격자탐색 문제에서 BFS 시간복잡도 질문드립니다.
0
334
1
3-O go 함수 질문 드립니다.
1
447
2
4-A 출력 질문
0
305
1
1주차 1-O 질문드립니다
0
259
1





