下面红色的那段怎么理解
#include<iostream>
using namespace std;
void main()
{int fentao(int a,int n);
int f,last;
for(f=1;!(last=fentao(f/5+1,1));f+=5);
cout<<"first="<<f<<endl<<"last="<<last<<endl;
}
int fentao(int a,int n)
{/*a:表示第n个猴子的桃子数;n表示他是第n个分的,因每个猴子分到的桃子子是整数,所以下一个猴子分前的4*(a-1)是5的倍数,故用整除*/
if(n==5)
return 4*(a-1);/*返回最后剩余桃子数目*/
else if((4*(a-1)-1)%5==0)return fentao((4*(a-1))/5+1,n+1);/*递归检验前一个猴子得到的桃子是不是整数*/
else return 0;/*若不是分到的为整数,则返回0*/
}
[解决办法]
“给定一个小点的输入,完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门!
递归函数关注以下几个因素
·退出条件
·参数有哪些
·返回值是什么
·局部变量有哪些
·全局变量有哪些
·何时输出
·会不会导致堆栈溢出
[解决办法]
- C/C++ code
for(f=1;!(last=fentao(f/5+1,1));f+=5);// f=1 初始值// !(last=fentao(f/5+1,1))循环条件// f+=5;每次执行f+=5//可能你对循环条件有疑问:last = fentao(f/5+1,1)这是一个赋值表达式,返回值就是你赋予的值,//也就是执行后last的值,!(last = fentao(f/5+1,1))就是如果赋值后如果last不为0即//fentao(f/5+1,1)不为0,结果就是true;进行循环