我正在使用置换函数来计算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;
}
但是,它只是打印了我的第一个组合。 我调试了一段时间,发现添加一个局部变量'j'到permutate函数,它工作。
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循环中被初始化并且其他地方的值没有改变时?
答案 0 :(得分:0)
你写了一个递归函数。
使用全局变量j
每次递归调用都会更改全局值的值。
因此,j
从递归返回时的值会发生变化:调用之前的值将丢失。