递归函数C?
为什么这个递归函数可以工作?我很难理解为什么它在n=1之前不一直调用自己,然后停止,不在调用自己的地方执行任何操作递归函数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
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