num = (getPeachNumber(n + 1) + 1) *
还有第二行代码:int getPeachNumber(n)是错误的。虽然在最后可以算出正确结果,但有错误提示。
(n)没有定义数据类型,因为是天数,所以用整型,(int n)
根据题意做下假设,就拿第5、6天来说明。
假设第5天桃子数为a,第6天桃子数为b,得到下面公式:
a/2-1=b //可以理解为这个公式用在递推
那么当计算到第10天,结果为1,反回值时就需要变换公式了
a-1*2=b*2 //等号两边乘以2
a=b*2+1*2 //把1*2移到等号右边
a=(b+1)*2 //把2提取出来
写成函数代码就是:(getPeachNumbern(n)+1)*2
又因为递推时,getPeachNumber(0)是没有意义,保证n最小值为1,就写成n+1
最后结果:(getPeachNumber(n+1)+1)*2
因为现在告诉你的是第十天的桃子数,而main函数中是求总桃子数,也就是第一天摘的桃子数,那怎么办呢?那么递归就是通过不断调用自身来获取已知的值,既然第一天桃子数不知道,那就看看第二天的桃子数,而第一天的桃子数等于第二天的桃子数+1再*2,那第二天的桃子数又不知道,又调用自身的函数,再往前推,一直到第十天,终于知道等于一个了,计算机这样不断累加回去得出最后的答案。
在这个程序中,初始设定只知道getpeachnumber(10)=1,要先推出(getpeachnumber(9+1)+1)*2=num(第九天的情况)才能继续往下推。
可以理解为函数有f(n+1)=f(n)-(f(n)/2+1),即第n+1天所剩桃子数,换过来f(n)=2*(f(n+1)+1),即第n天所剩桃子数,f(n)=num
应为递归 最后一次为第十天剩下1个桃子,由此往前推,剩下的1桃子个加1乘以2得到前一天的(由后向前从第十天-第九天----第一天)