为什么在递归中使用循环会产生意外结果?

Cha*_*kul 0 c++ recursion

我有以下功能.

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);
}
Run Code Online (Sandbox Code Playgroud)

我想将绳索长度n切成长度1或长度2并打印所有可能的切口.如

输入: 4将产生 输出: 1111 112 121 211 22

上面的代码有效,但是当我使用下面的代码替换else部分中的代码时,为什么它不会产生相同的输出?

for (j = 1;j <= 2; j++){
      a[c] = j;
      can(x-j,c+1);
}
Run Code Online (Sandbox Code Playgroud)

Bla*_*aze 7

因为它是递归函数,但是j是全局的,所以你只有1 j.这就是为什么这个循环在这里:

for (j = 1;j <= 2; j++){
      a[c] = j;
      can(x-j,c+1);
}
Run Code Online (Sandbox Code Playgroud)

产生不好的结果,因为j尽管这不是你的意图,但是多次使用相同的结果.试试这个:

for (int j = 1;j <= 2; j++){
      a[c] = j;
      can(x-j,c+1);
}
Run Code Online (Sandbox Code Playgroud)

现在循环的每次执行都有自己的j,所以它应该按预期工作.