繁体   English   中英

为什么return语句不结束c中的递归函数?

[英]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中的代码块将无法访问,因为递归部分将一直递减计数直到n1为止,并且将返回数组的第一项。 我假设代码不会超出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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM