2016-06-22 3 views
1

저는 재귀를 사용하여 n 매개 변수에서 int 벡터를 생성하고이를 인터리브하는 permute 함수를 작성합니다. 세분화 오류가 발생하지만 작업을 시작하는 데 많은 어려움을 겪고 있습니다.()C++ - 순열 함수

void print(const vector<int>& v) 
{ 
    for (auto it = v.begin(); it != v.end(); ++it) 
    { 
     cout << *it << ' '; 
    } 

    cout << endl; 
} 

vector<vector<int> > interleave(int x, const vector<int>& v) 
{ 
    size_t i; 
    vector<vector<int> > results; 

    for (i=0;i<=v.size();i++) 
    { 
     vector<int> temp(v); 

     temp.insert(temp.begin()+i, x); 
     results.push_back(temp); 
    } 

    return results; 
} 

vector<vector<int> > permute(size_t n) 
{ 
    size_t i, j; 
    vector<vector<int> > v; 
    auto vectors = permute(n-1); 
    vector<vector<int> > results; 
    for (j=0;vectors.size();j++) 
    { 
     for (i=1;i<=n-1;i++) 
     { 
      vectors[j].push_back(i); 
     } 
    } 

    for (j=0;j<=vectors.size();j++) 
    { 
     for (i=1;i<=n-1;i++) 
     { 
      vector<vector<int> > temp = interleave(i,vectors[j]); 
      results.insert(results.end(), temp.begin(), temp.end()); 
     } 
    } 

    return results; 
} 

int main(void) 
{ 
    size_t i; 
    vector<vector<int> > results = permute(3); 
    for (i=0;i<results.size();i++) 
    { 
     print(results[i]);  
    } 
} 
+3

[작은 프로그램을 디버깅하는 방법] (http://ericlippert.com/2014/03/05/how-to-debug-small-programs/). –

+3

디버거를 사용하여 코드를 단계별로 실행하는 것을 관찰 했습니까? –

+1

'자동 벡터 = 순열 (n-1);'super suss를 보입니다. – Tas

답변

3

변경하다 끝없이 재귀 : 여기 내 코드는 항상 변경하다를 호출합니다 (N-1). 결과적으로 스택 오버플로가 발생합니다. 왜 세그먼트 오류가 발생하는지 확신 할 수 없습니다 (코드에 다른 문제가있을 수 있음). 또한

:

for (j=0;vectors.size();j++) { 

않습니다 종료합니다. 당신은 아마 의미 :

for (j=0;j<vectors.size();j++) { 

참고 < 대 < =. j = vectors.size() 인 경우 vectors [j]가 범위를 벗어난 항목에 액세스합니다.

+0

범위를 벗어난 항목에 액세스하기 때문에 segfaults가 발생합니다. 최소한 릴리스 모드에서. 디버그 모드의 경우 operator []를 사용하여 범위를 벗어난 액세스가 발생하면 예외가 throw됩니다. – ead