Почему использование циклов в рекурсии приводит к неожиданным результатам? - PullRequest
0 голосов
/ 22 октября 2018

У меня есть следующая функция.

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 * ​​1010 *

Код выше работает, но когда я заменяю код вв другом разделе, использующем приведенный ниже код, почему он не выдает такой же вывод?

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

1 Ответ

0 голосов
/ 22 октября 2018

Поскольку это рекурсивная функция, но 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, поэтому он должен работать как задумано.

...