Почему эти два одинаковых рекурсивных C-кода дают разные результаты? - PullRequest
0 голосов
/ 16 января 2019

Я думал об этом часами ...

Я пытаюсь объяснить это, но если вы чувствуете, что это не ясно, просто попробуйте мои коды ...

Первый код следует за i = 1,1,1,2,3,2,3,2,3, а c следует за 0 -> 1 -> 2 -> 3.

#include <stdio.h>
int c = 0;
void func (int a){
    c = a + 1;
    printf("%d", c+100);
    for (int i = 1; i <= 3; i++)
    {
        printf("%d", i );
        if (c <= 2){
            func(c);
        }
    }
}
int main(int argc, const char *argv[]){
    func(c);
    return 0;
}

Второй код следует i = 1,1,1,2,3,2,1,2,3,3,1,2,3,2,1,1,2,3 ... (39 i всего), и c следует за 0 -> 1 -> 2 -> 3 -> 2 -> 3 -> 2 -> 3.

#include <stdio.h>
int c = 0;
void func (int c){
    c = c + 1;
    printf("%d", c+100);
    for (int i = 1; i <= 3; i++)
    {
        printf("%d", i );
        if (c <= 2){
            func(c);
        }
    }
}
int main(int argc, const char *argv[]){
    func(c);
    return 0;
}

Единственным отличием является параметр в func (), а именно "void func (int a)" и "c = a + 1".

Не могли бы вы объяснить причину, по которой в первом коде "c" ведет себя как глобальная переменная, но во втором коде после того, как "c" становится 3, он все равно может вернуться к 2 и привести к дальнейшей рекурсии.

Большое спасибо!

1 Ответ

0 голосов
/ 16 января 2019

Когда вы объявляете параметр int c во втором func, он затеняет глобальный c, поэтому все дальнейшие изменения в рамках функции применяются только к локальному c вместо глобального.

...