#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结束,那么会进行出栈操作,这样又会回到你上一步压栈的位置了。
这也是为什么不建议大家使用递归,特别是资源小的嵌入式单片机下,因为递归会使压栈数据过多导致栈溢出。