안녕하세요! 재귀함수에 관해서 질문드립니다
531
23 câu hỏi đã được viết
교안 p.118에 있는 재귀함수 예제문제에서
for(int i = depth; i < n; i++){
swap(v[i], v[depth]); //첫번째 swap(v[i], v[depth]);
makePermutation(n, r, depth + 1);
swap(v[i], v[depth]); //두번째 swap(v[i], v[depth]);
} return;
이렇게 예제가 나와있습니다.
제가 이해한 바로는,
함수 makePermutation에 (3, 3, 0)을 대입하면
i와 depth는 0으로 첫번째 swap(v[i], v[depth]); 은 swap(0,0)이 되고
for문 안에 있는 makePermutation에 의해 매개변수 (3, 3, 0)이 (3, 3, 1)로 변하게되어
(3, 3, 1)에 해당하는 함수 makePermutation을 실행하게 되어 다시 첫번째 swap(v[i], v[depth]);이 실행되는 방식인 것으로 이해를 하였습니다.
여기서 첫번째 swap(v[i], v[depth]); 의 역할은 이해가 가지만 두번째 swap(v[i], v[depth]); 의 역할은 이해가 가지 않아서 질문 드렸습니다. 감사합니다!
Câu trả lời 1
1
안녕하세요 1209님 ㅎㅎ
해당 부분은 원복입니다.
예를 들어
1 2 3
에서
1 3 2로 바꿨다면
다시
1 2 3으로 바꾸는 코드입니다.
저 코드는 경우의수를 위해 존재하는 거에요.
좀 더 쉽게 생각을 해보면,
이렇게 그래프가 있다고 할 때 1, 2, 3과 1, 2,4를 뽑고 싶어요.
이 때 1, 2, 3을 뽑고 !!! 다시 2로 돌아와서 1, 2 상태에서 1, 2, 4를 뽑는 것이죠.
그러면 이 때 3을 뽑는 "상태"를 되돌려야 되요.
즉, {1, 2} 상태에서 {1, 2, 3}으로 갔다가 {1, 2}로 와서 {1, 2, 4}로 가야 하는 것이죠.
그런 것을 위한 "원복"코드입니다.
해당 부분은 디버깅을 하면서 이해하시면 이해가 되는데요.
제가 해당 코드에 디버깅 코드를 넣어봤는데요.
참고부탁드립니다.
#include <bits/stdc++.h>
using namespace std;
int a[3] = {1, 2, 3};
vector<int> v;
void printV(vector<int> &v){
for(int i = 0; i < v.size(); i++){
cout << v[i] << " ";
}
cout << "\n";
}
void makePermutation(int n, int r, int depth){
if(r == depth){
printV(v);
return;
}
for(int i = depth; i < n; i++){
swap(v[i], v[depth]);
cout << i << " : " << depth << " 바꾼다!!\n";
printV(v);
makePermutation(n, r, depth + 1);
swap(v[i], v[depth]);
cout << i << " : " << depth << " 다시 바꾼다!!\n";
printV(v);
printV(v);
}
return;
}
int main(){
for(int i = 0; i < 3; i++)v.push_back(a[i]);
makePermutation(3, 3, 0);
return 0;
}
/*
0 : 0 바꾼다!!
1 2 3
1 : 1 바꾼다!!
1 2 3
2 : 2 바꾼다!!
1 2 3
1 2 3
2 : 2 다시 바꾼다!!
1 2 3
1 2 3
1 : 1 다시 바꾼다!!
1 2 3
1 2 3
2 : 1 바꾼다!!
1 3 2
2 : 2 바꾼다!!
1 3 2
1 3 2
2 : 2 다시 바꾼다!!
1 3 2
1 3 2
2 : 1 다시 바꾼다!!
1 2 3
1 2 3
0 : 0 다시 바꾼다!!
1 2 3
1 2 3
1 : 0 바꾼다!!
2 1 3
1 : 1 바꾼다!!
2 1 3
2 : 2 바꾼다!!
2 1 3
2 1 3
2 : 2 다시 바꾼다!!
2 1 3
2 1 3
1 : 1 다시 바꾼다!!
2 1 3
2 1 3
2 : 1 바꾼다!!
2 3 1
2 : 2 바꾼다!!
2 3 1
2 3 1
2 : 2 다시 바꾼다!!
2 3 1
2 3 1
2 : 1 다시 바꾼다!!
2 1 3
2 1 3
1 : 0 다시 바꾼다!!
1 2 3
1 2 3
2 : 0 바꾼다!!
3 2 1
1 : 1 바꾼다!!
3 2 1
2 : 2 바꾼다!!
3 2 1
3 2 1
2 : 2 다시 바꾼다!!
3 2 1
3 2 1
1 : 1 다시 바꾼다!!
3 2 1
3 2 1
2 : 1 바꾼다!!
3 1 2
2 : 2 바꾼다!!
3 1 2
3 1 2
2 : 2 다시 바꾼다!!
3 1 2
3 1 2
2 : 1 다시 바꾼다!!
3 2 1
3 2 1
2 : 0 다시 바꾼다!!
1 2 3
1 2 3
*/
또 질문 있으시면 언제든지 질문 부탁드립니다.
좋은 수강평과 별점 5점은 제게 큰 힘이 됩니다. :)
감사합니다.
강사 큰돌 올림.
1-E질문입니다!
0
508
2
3-L 틀린 부분 피드백 부탁드립니다.
0
811
2
1-A문제 순열재귀함수 질문입니다.
0
376
1
1-A 일곱난쟁이문제입니다
0
451
1
문제 풀 때 방향성에 대해
0
793
1
맥에서 vs code로 실행 관련 질문입니다
0
515
1
17071번 메모리 초과
0
381
1
1-C질문입니다!
0
411
2
2-B BFS 시간초과질문
0
622
2
1-O 13번 라인
0
434
1
6-J 놀이공원 문제 질문
0
375
1
구현관련 질문
0
478
1
강의 교안
0
313
1
실력을 더 올리고나서 강의를 보는 것이 맞을까요?
0
541
1
1-K
0
468
2
3-G번 질문있습니다.
1
464
3
3-C 실행 시간 질문드립니다.
0
489
1
4-A 문제 풀이 질문있습니다.
0
586
2
비트마스킹 연산자 "1의 보수" 영문 표기법
0
430
1
격자탐색 문제에서 BFS 시간복잡도 질문드립니다.
0
329
1
3-O go 함수 질문 드립니다.
1
437
2
4-A 출력 질문
0
298
1
1주차 1-O 질문드립니다
0
250
1
2-S (1325번 - 효율적인 해킹) 문제 질문 드립니다.
0
505
1

