有一只猴子,第一天摘了若干个桃子 ,当即吃了一半,但还觉得不过瘾 ,就又多吃了一个。
第 2 天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。以后每天早上
都吃了前一天剩下的一半加天数个(例如,第 5 天吃了前一天剩下的一般加 5 个)。到第 n
天早上再想吃的时候,就只剩下一个桃子了。
输入:
天数 n
输出:
第一天的桃子个数
请问下思路,总是绕不过来弯,用递归如何实现呢
你可以倒着来,这样想。
get(1)=1就是第一天有一个桃
get(2)=2(1+(n-1))
get(3)=2(get(2)+(n-2))
这样以此类推
get(n)=2(get(n-1)+(n-(n-1)))
然后化简
得到一个递归公式
也就是如果是n天那么桃子就有
2(get(n-1)+1)个
如果n等于一那么只有一个桃子
用手机写代码蛋疼
这里就不贴代码了
楼主自己完善
根据天数递归,public class Test {
private static int c = 1;
public void getC(int n){
if(n>0){
c=(c+n)*2;
getC(n-1);
}
}
public static void main(String[] args) {
new Test().getC(2);
System.out.println(c);
}
}
java 代码供你参考
int N = 3;
int f(int n)
{
if (n == N){
return 1;
}
else{
return (f(n + 1) + n) * 2;
}
}
#include<stdio.h>
根据天数递归
int c = 1;
void getC(int n){
if(n>0){
c=(c+n)*2;
getC(n-1);
}
}
void main() {
getC(2);
printf("%d",c);
}
}
大致思路如下,手机写的,没调试
假设桃子总数为sum,
那么第n天吃过桃子之后也就是n+1天吃桃子之前剩余的桃子函数如下
int sum = 4;
int f(int n)
{
if(n<=0) return 0;
else if(n==1) return (sum/2 - 1);
else return (f(n-1)/2-n);
}
int main()
{
//请输入N,N>1
while(1)
{
if(f(N-1)==1) break;
sum++;
}
//此处得到sum的值
return 0;
}
// 有一只猴子,第一天摘了若干个桃子 ,当即吃了一半,但还觉得不过瘾 ,就又多吃了一个。
// 第 2 天早上又将剩下的桃子吃掉一半,还是觉得不过瘾,就又多吃了两个。以后每天早上
// 都吃了前一天剩下的一半加天数个(例如,第 5 天吃了前一天剩下的一般加 5 个)。到第 n
// 天早上再想吃的时候,就只剩下一个桃子了。
// 输入:
// 天数 n
// 输出:
// 第一天的桃子个数
#include <iostream>
using namespace std;
// static int a = 0;
int eattheday(int n, int max, int a)
{
if(n == 1)
return 1;
if(a < max - 1)
// a += 1;
if(a < max)
a+=1;
return (eattheday(n-1, max, a) + a) * 2;
}
int main()
{
int n; // 天数
int day; // 记录天数
int a = 0;
cin >> n;
day = n;
cout << eattheday(n, day, a);
return 0;
}
/*
假设用了3天
首次吃(一半) 再吃 剩余
第一天(n = 3): 14 7 6
第二天(n = 2): 6 3 1
第三天(n = 1): 1
a(1) = 1
a(2) = (a(1) + 2) * 2 = 6
a(3) = (a(2) + 1) * 2 = 14
....
a(n) = (a(n-1) + a) * 2 ------ a 自增
*/
自己还是很菜,有更好的方法请告诉我,(逃)
自己还是很菜,有更好的方法请告诉我,(逃)