C语言猴子吃桃问题递归法

我写的是这样的:
#include <stdio.h>
void main()
{
long tao(int r_day);
long x;
int day,reverse_day;
day=1;
reverse_day=11-day;
x=tao(reverse_day);
printf("total=%d\n",x);
}
long tao(int r_day)
{
long y;
if(r_day==1)
y=1;
else
y=2*(tao(r_day-1)+1);
return y;
}
----------------------------
我的问题:
y=2*(tao(r_day-1)+1);

这一句怎样能写成 /2-1的形式?(第2天又将吃剩的桃子吃掉一半,又多吃了一个)

我在百度上看到一个解法是这样的:
#include <stdio.h>
const unsigned int &fun_last(const int &n,const int &day)
{
if(n<0) return -1;
if(day==1) return n;
return fun_last(2*(n+1),day-1); //当天剩n个,前一天剩下2*(n+1)个
}
int main(void)
{
int day=10,n=1;
printf("第一天摘下%d个桃子\n",fun_last(n,day));
return 0;
}
我对递归的概念不是很清晰,
他的这个解法是不是函数在递归到第10次调用的时候就直接返回一个值了?
而我的解法是不是第10次调用以后需要逐级回退(弹出栈)最后才得到最终的值?
而且他的参数和返回值都是引用,是不是都是从栈里直接取值,而不用拷贝各个形参和返回值变量?
感觉学谭教授的书很难写出他这样的代码。

第1个回答  2011-05-11
你的递归函数些错了, 参考我些的:

int sb(n)
{
int m = 0;
if (1 == n) return 1;
return sb(n - 1) * 2 + ++m;
}
第2个回答  2013-02-20
猴子偷桃吗
相似回答