我具有以下功能。
int n,cnt,i,j;
int a[100];
void can(int x,int c){
if (x == 0){
for (i = 0; i < c; i++){
cout << a[i];
} cout<<endl;
}
if (x<0) c-=1;
else{
a[c] = 1;
can(x-1,c+1);
a[c] = 2;
can(x-2,c+1);
}
}
int main(){
cin >> n;
can(n,0);
}
我想将长度为n的绳索切成长度1或长度2,并打印所有可能的切口。 如
输入:将产生4个 输出: 1111 112 121 211 22
上面的代码有效,但是当我使用下面的代码替换else部分中的代码时,为什么它不会产生相同的输出?
for (j = 1;j <= 2; j++){
a[c] = j;
can(x-j,c+1);
}
答案 0 :(得分:7)
因为它是一个递归函数,但是j
是全局的,因此您只有1个j
。这就是这里的循环的原因:
for (j = 1;j <= 2; j++){
a[c] = j;
can(x-j,c+1);
}
产生不好的结果,因为尽管不是您的意图,但多次使用同一j
。尝试以下方法:
for (int j = 1;j <= 2; j++){
a[c] = j;
can(x-j,c+1);
}
现在,循环的每个执行都有其自己的j
,因此它应按预期工作。