[英]Why doesn't return statement end a recursive function in c?
这是我正在使用的代码:
#include <stdio.h>
int f_b(int n, int a[n]);
int main() {
int a[4] = { 7, 6, 5, 4 };
printf("\n return: %d \n", f_b(4, a));
}
int f_b(int n, int a[n]) {
int m;
if (n == 1)
return a[0];
m = f_b(n - 1, a);
printf("m:%d", m);
if (m > a[n - 1]) {
printf("\n m was greater than the last item\n ");
return a[n - 1];
} else
return m;
}
这是它给出的输出:
m:7
m was greater than the last item
m:6
m was greater than the last item
m:5
m was greater than the last item
return: 4
我原本以为第一个printf
之后的f_b
中的代码块将无法访问,因为递归部分将一直递减计数直到n
为1
为止,并且将返回数组的第一项。 我假设代码不会超出m = f_b(n-1, a);
行,直到返回它的最后一个值,然后继续执行if
- else
语句。 看来它将通过if
- else
每个递归调用?
我注意到每次都没有返回数组的第一项,这促使我用printf
语句printf
。 我不明白当还有一个return a[n-1]
语句以至于我认为会跳出函数时,如何多次到达“ m大于最后一项”这一行。 我知道它正在从每个递归调用中跳出,但是为什么它在结束递归调用时不总是返回a[0]
?
请在这里纠正我的想法,因为输出(如我所见)显示了return
语句,但该语句也已传递。 是否由于递归达到了那么多次? 如果是这样,到底是什么停止了代码(因为n
可以无限期递减)
该函数的每个递归调用都有一个返回值,以后再调用时不会跳出递归到main的递归,而只是跳到上一个调用。 这就是它可以到达多个return语句的方式。
随着每个调用在堆栈上的解析,该函数将在其余代码中完成,这就是我们到达递归调用之后的代码的方式(在f_b中)
如果我没记错的话,此函数将返回数组中的最小值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.