2014-01-06 1 views
1

비 재귀 적 형태로이 함수를 어떻게 다시 쓸 수 있습니까?비 재귀 형태로이 함수를 어떻게 다시 쓸 수 있습니까?

void generate(int pos) 
{ 
    if (pos == n + 1) 
    { 
    print_table(); 
    } 
    else 
    { 
    for (int i = 1; i <= n; i++) 
    { 
     if (!used[i]) 
     { 
     used[i] = true; 
     perm[pos] = i; 
     generate(pos + 1);////recursion 
     used[i] = false; 
     } 
    } 
    } 
} 
+1

'n'은 어디에서 왔습니까? –

+1

@Vite는 무엇이 중요합니까? –

+1

명시 적 스택을 사용 하시겠습니까? BTW,이 기능은 무엇입니까? –

답변

2

이 코드는 1, ..., n의 각 순열에 대해 print_table()을 호출하는 것으로 보입니다. C++에는 내장 도구가 있습니다.

#include <algorithm> 

void generate() { 
    int n = 10; // or whatever 

    std::vector<int> perm(n); 
    for(int i=0; i<n; i++) perm[i] = i+1; 
    do { 
     print_table(perm); 
    } while(std::next_permutation(perm, perm+n)); 
} 
+0

죄송합니다. 지금 수정했습니다. 이 코드에는'used'가 없어야합니다. –

+0

감사! 벌금! 거의 작동합니다. 하지만 그렇지 않으면 함수가 나를 위해 쓸모없는 결과를 만들어냅니다. 내 마음에 std :: next_permutation 알고리듬의 문제 –

+0

그 값들은'perm [0], ..., perm [n-1]'에 저장되어있는 반면,'perm [ 1], ..., perm [n]'을 포함 할 수있다. C/C++에서 배열이 0부터 시작하여 인덱싱되는 것은 정상입니다. –

1

코드는 요소 목록의 모든 순열을 생성하는 표준 재귀 알고리즘 인 것으로 보입니다. 재귀 알고리즘을 기계적으로 반복적으로 (아마도 어떤 종류의 스택을 필요로하는) ​​반복적 인 알고리즘으로 마사지하는 대신,리스트의 모든 순열을 나열하는 반복 알고리즘을 살펴볼 수 있습니다. 예를 들어, C++은 순열을 나열하는 데 사용할 수있는 std::next_permutation 알고리즘을 제공합니다. 참고로, 나는 어떻게 작동하는지 설명하는 해설과 함께 a simple implementation of this algorithm을 가지고있다.

희망이 도움이됩니다.

관련 문제