2016-08-30 3 views
0

C 언어로 배열의 모든 순열을 계산하기 위해 순열 함수를 사용하고있었습니다. 함수의 프로토 타입은 다음과 같습니다전역 변수의 효과

#include <stdio.h> 
int arr1[]={1,2,3,4,5},N,i,x,j; 

void swap1(int s,int t) 
{ 

    int temp1=arr1[s]; 
    arr1[s]=arr1[t]; 
    arr1[t]=temp1; 
} 

void permutate(int i) 
{ 
    if(i==N){ 
     for(x=0;x<N;x++){ 
     printf("%d",arr1[x]); 
     } 
    printf("\n"); 
    } 
    else{ 
     for(j=i;j<N;j++){ 
     swap1(i,j); 
     permutate(i+1); 
     swap1(i,j); 
     } 
    } 
} 

int main(void) 
{ 
     N=5; 
     permutate(0); 
    return 0; 
} 

Howewer, 그냥 나에게 처음으로 조합을 출력한다. 잠시 동안 디버깅 한 결과 지역 변수 'j'를 추가하여 함수가 순열됨을 알았습니다.

void permutate(int i){ 
    int j;     <<<---this is my problem 
    if(i==N){ 
     for(x=0;x<N;x++){ 
     printf("%d",arr1[x]); 
     } 
    printf("\n"); 
    } 
    else{ 
     for(j=i;j<N;j++){ 
     swap1(i,j); 
     permutate(i+1); 
     swap1(i,j); 
     } 
    } 
} 

for 루프에서도 초기화되고 값이 다른 곳에서는 변경되지 않는 이유는 무엇입니까?

+1

.... 왜냐하면 당신의 함수가 반복적이기 때문입니다 ...... – LPs

+4

변수'j'를 루프에서 인쇄하고 당신이 볼 것입니다 ... 당신은 "private"'j'가 필요합니다. 재귀가 단락 된 경우 순열에 대한 각 호출. –

+0

당신은 방금 전역 변수를 사용하는 것을 꺼리는 이유를 찾았습니다;) 재진입을 막고 글로벌 프로그램에 부작용이 생겼습니다 .... http://stackoverflow.com/questions/484635/are-global-variables-bad – Garf365

답변

0

당신은 재귀 함수를 작성했습니다.

전역 변수 j을 사용하면 각 재귀 호출이 전역 값의 값을 변경합니다.

그래서 재귀에서 복귀 할 때 j의 값이 변경됩니다. 호출하기 전의 값이 손실됩니다.

관련 문제