递归函数C?

递归函数C?,c,recursion,C,Recursion,为什么这个递归函数可以工作?我很难理解为什么它在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

为什么这个递归函数可以工作?我很难理解为什么它在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];
        }
    }
}
intmain(){
int t[]={7,9,6,4,2};
最小整数,最大整数;
搜索(t,sizeof(t)/sizeof(t[0])、最小值和最大值);
printf(“最小值:%d,最大值:%d”,最小值,最大值);
返回0;
}
无效搜索(常量int t[],int n,int*min,int*max){
if(nt[n-1]){
*min=t[n-1];
}   
否则如果(*max
每当您想了解递归函数的功能时,请插入两个打印输出


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];
                }
        }
}

如您所见,它确实会一直持续到n=1。

它实际上会一直调用自己直到n=1。有什么问题?我在onlinegdbIt上试过,它会一直调用自己,直到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