2016-06-17 3 views
3

다음 코드 단편은 배열의 요소를 4 문자 길이로 반복하여 (조합없이) 인쇄합니다.inner for 루프 호출을 무기한 확장

for (int i = 0; i < len; i++) 
    for (int j = i + 1; j < len; j++) 
     for (int k = j + 1; k < len; k++) 
      for (int l = k + 1; l < len; l++) 
       printf("%c%c%c%c\n", arr[i], arr[j], arr[k], arr[l]); 

내 문제는 일반적인 기능 (예 : N 문자 길이의 조합을 모두 인쇄)으로 확장하는 방법을 모르겠다는 것입니다. 이와 exemple 들어

int i, j, w, x; 
for(i=0; i<pow(len,len); i++){ //n^n possibilities/combinaisons 
    w = i; 
    for(j=0; j<len; j++){ //Show the combinaison 
     x = w%len; //We have juste to calculate the correct position with some modulos 
     printf("%c", array[x]); 
     w = w/len; 
    } 
    printf("\n"); 
} 

:

combinationPrint(array, numberOfForLoops); // With other params if needed 
+7

무엇 당신의 시도가 실패한 모습입니까? – melpomene

+2

_ 디버깅 도움말을 찾는 질문 ("이 코드가 작동하지 않는 이유는 무엇입니까?")에는 원하는 동작, 특정 문제 또는 오류 및 질문 자체에서이를 재현하는 데 필요한 가장 짧은 코드가 포함되어야합니다. 분명한 문제 설명이없는 질문은 다른 독자에게 유용하지 않습니다. 다음을 참조하십시오 : 최소, 완전하고 검증 가능한 예제를 만드는 방법. –

+0

검색 : ** 주어진 문자열의 모든 순열 **, 아마도 도움이 될 수 있습니다 : http://www.geeksforgeeks.org/write-ac- program-to-print-all-permutations-of-given-string/ – Cherubim

답변

3

함수의 재귀 버전은 다음과 같이 작동합니다 :

void recur (char* arr, int i, int len, char *x, int k, int n) { 
    if (k==n) { // the last inner loop 
     x[k]=0; 
     printf ("%s\n", x); 
    } 
    else { 
     for (int j=i+1; j<len; j++) { // recursive loop 
      x[k]=arr[j]; 
      recur (arr, j, len, x, k+1, n); // call recursion for an inner loop 
     } 
    } 
} 

을이 재귀에서 arrlen은 당신의 정의에 해당 n은 당신이 당신의 비 재귀 버전 (4를 달성하고자하는 루프의 깊이).

트릭은 n + 1 문자의 null로 끝나는 배열을 사용하여 재귀를 가로 지르고 마지막 수준에서 인쇄 할 문자열을 작성하는 것입니다. i는 루프의 시작 위치이고 k는 현재 재귀 수준입니다.

이 부를 것이다 : N 대신

recur (arr, -1, len, out, 0, 4); 

Online demo

2

재귀없이,이 (배열의 렌은 = 길이)를 사용할 수 있습니다 : 어떻게 내가 함수가 같은 일을하지만, 다음과 같이 호출 할 수 있습니다 구현 :

#include <stdio.h> 
#include <math.h> 

int main(){ 

    int array[] = {1,2,3}; 

    int len = 3; 
    int i, j, w, x; 
    for(i=0; i<pow(len,len); i++){ 
       w = i; 
       for(j=0; j<len; j++){ 
         x = w%len; 
         printf("%d", array[x]); 
         w = w/len; 
       } 
    printf("\n%d\n", i); 
    } 

} 

당신은이 있어야합니다

111 
211 
311 
121 
221 [...] 
133 
233 
333 
+0

이것은 훌륭하지만 코드를 반복하면 숫자를 반복하지 않고도 결과를 알 수 있습니다 (예 : 1, 1, 2 ...). 이렇게하려면 함수를 수정하는 방법이 있습니까? –

0

글쎄, 루프 - 당신이 하나 필요합니다. 이 메인 루프 내에서 당신은 인덱스의 배열을 증가 및 인쇄 값에 대한 두 내부 루프가 있어야 :

int increment(int* index, int N, int len) 
{ 
    for (int i = N - 1; i >= 0; --i) 
    { 
     ++index[i]; 
     if (index[i] < len) 
      return 1; 
     index[i] = 0; 
    } 
    return 0; 
} 

그래서 - 메인 루프 :

int index[N] = {}; 

    do 
    { 
     // print 
     for (int i = 0; i < N; ++i) 
      printf("%c", arr[index[i]]); 
     printf("\n"); 
    } while (increment(index, N, len));