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
你不应该在被调函数中定义m=1 不然当你反复调用被调函数是 m都会被重新赋值。
我的程序:
#include <stdio.h>
int sb(int,int);
int main( )
{
int n;
scanf("%d",&n);
printf("The monkey got %d peachs in first day.\n",sb(1,n));
return 0;
}

int sb(int m,int n)
{
if(m==n)
return 1;
else
return 2*(sb(m+1,n)+m);
}
第2个回答  2008-12-07
Dim t As Integer

Function Tao(i As Integer) As Integer
If i < 10 Then '如果i<10则条件成立
t = (t + 1) * 2 计算前一天桃子的个数
i = i + 1 '再推前一天
Tao (i) '递归
End If
End Function

Private Sub Command1_Click()
t = 1
Tao (1) '调用Tao
Print t
'结果t=1534
End Sub
第3个回答  2019-07-13
#include<stdio.h>
int N; //吃到N天还没吃时,剩1个,全局变量
int funn(int n)
{
if(n==N)
return 1;
else
return 2*funn(++n)+2;
}
int main()
{
int days,y;
printf("输入多少天后剩一个\n");
scanf("%d",&N);
for(days=1;days<=N;days++)
{
y=funn(days);
printf("days%d\t%d\n",days,y);
if(y<0)
{
printf("有误");
break;
}
}
}
第4个回答  2008-12-21
option explicit

dim i as integer,t as integer

t=1
for i = 8 to 1 step -1
t = 2 * ( t + 1 )
next
print t
第5个回答  2011-05-11
#include <stdio.h>
int sb(int n,int m);
int main( )
{
int n,m;
scanf("%d",&n);
printf("The monkey got %d peachs in first day.\n",sb(n,m));
return 0;
}

int sb(n,m)
{

m=1;

if(n==1)
return(1);
else
return(2*(m+sb(n-1,m+1)));
}
相似回答