这是一个关于函数递归的问题

#include<stdio.h>
#include<conio.h>
/*分鱼递归函数*/
int fish(int n, int x)
{
    if((x-1)%5 == 0)
    {
        if(n == 1)
            return 1;  /*递归出口*/
       else
            return fish(n-1, (x-1)/5*4);  /*递归调用*/
    }
    return 0;  /*x不是符合题意的解,返回0*/
}
int main()
{
    int i=0, flag=0, x;
    do
    {
        i=i+1;
      x=i*5+1;  /*x最小值为6,以后每次增加5*/
       if(fish(5, x))  /*将x传入分鱼递归函数进行检验*/
        {
            flag=1;  /*找到第一个符合题意的x则置标志位为1*/
            printf("五个人合伙捕到的鱼总数为%d\n", x);
        }
    }
    while(!flag);  /*未找到符合题意的x,继续循环,否则退出循环*/
    getch();

    return 0;
}


我调试这个代码
fish函数,调试到return 0的时候,有的时候竟然下一步是else 下面的 return fish(n-1,(x-1)/5*4),,不是main函数,好奇怪

这很正常, return fish(n-1, (x-1)/5*4);这里调用了fish,自然下一层的return返回到了else那里

你可以写

else
{
    int rreult = fish(n-1, (x-1)/5*4);  /*递归调用*/
    return result;
}

断点打在result看下

这是正常的,反推的话return 0的上一步就是else里的函数。其实程序运行的过程就是入栈和出栈操作,调用fish(n-1, (x-1)/5*4)的时候会将当前的状态压栈(保存现场),然后执行进入fish函数,如果fish结束,那么会进行出栈操作,这样又会回到你上一步压栈的位置了。

这也是为什么不建议大家使用递归,特别是资源小的嵌入式单片机下,因为递归会使压栈数据过多导致栈溢出。