2016-08-30 6 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'を追加することがわかりました。

forループでも初期化されているにもかかわらず、他の場所で値が変更されないのはなぜですか?

+1

....あなたの関数のために再帰的です...... – LPs

+4

変数 'j'をループ内で印刷して追跡すると、なぜでしょう...あなたは" private "' j'を必要とします再帰が短絡されていない場合は、各呼び出しは順列になります。 –

+0

あなたは誰もがなぜグローバル変数を使用することを嫌うのかを知ることができます;)再入場を中断し、グローバルプログラムに悪影響を及ぼします.... http://stackoverflow.com/questions/484635/are-global-variables-bad – Garf365

答えて

0

あなたは再帰関数を書きました。

グローバル変数jを使用すると、各再帰呼び出しでグローバル値の値が変更されます。

したがって、再帰から戻ったときのjの値が変更されます。呼び出し前の値は失われます。