Рекурсивная функция C? - PullRequest
       8

Рекурсивная функция C?

1 голос
/ 05 ноября 2019

Почему эта рекурсивная функция работает? У меня возникают проблемы с пониманием того, почему он не продолжает вызывать себя до n = 1, а затем останавливается, не выполняя ничего ниже того, что вызывает сам.

int main(){
    int t[] = {7,9,6,4,2};
    int min, max;
    search_extremes_rec(t, sizeof(t)/sizeof(t[0]), &min, &max);
    printf("min: %d, max: %d", min, max);
    return 0;
}
void search_extremes_rec(const int t[], int n, int *min, int *max){
    if(n<=1){
        *min = t[0];
        *max = t[0];
    }else{
        search_extremes_rec(t, n-1, min, max);
        if(*min > t[n-1]){
            *min = t[n-1];
        }   
        else if(*max < t[n-1]){
            *max = t[n-1];
        }
    }
}

1 Ответ

1 голос
/ 05 ноября 2019

Всякий раз, когда вы хотите узнать, что делает рекурсивная функция, вставьте пару распечаток.


void search_extremes_rec(const int t[], int n, int *min, int *max){
        printf("Entering search_extremes_rec. n:%d\n", n);
        if(n<=1){
                printf("Base case. Exiting\n");
                *min = t[0];
                *max = t[0];
        }else{
                printf("Calling recursively...\n");
                search_extremes_rec(t, n-1, min, max);
                printf("Recursive call done. n:%d min:%d max:%d\n", n, *min, *max);

                if(*min > t[n-1]){
                        *min = t[n-1];
                }
                else if(*max < t[n-1]){
                        *max = t[n-1];
                }
        }
}

Вывод:


$ ./a.out 
Entering search_extremes_rec. n:5
Calling recursively...
Entering search_extremes_rec. n:4
Calling recursively...
Entering search_extremes_rec. n:3
Calling recursively...
Entering search_extremes_rec. n:2
Calling recursively...
Entering search_extremes_rec. n:1
Base case. Exiting
Recursive call done. n:2 min:7 max:7
Recursive call done. n:3 min:7 max:9
Recursive call done. n:4 min:6 max:9
Recursive call done. n:5 min:4 max:9
min: 2, max: 9

Как видите, она действительно продолжаетсяпока n = 1.

...