一只猴子第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个;第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半加一个。到第N天早上想再吃时,见只剩下一个桃子了。问:第一天共摘了多少个桃子?
解:假设 表示第 天, 表示第 天剩余的桃子数。则如图:
第 天 | 第 天剩余的桃子数 |
---|---|
1 | x --->x / 2 - 1 (第一天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个) |
2 | x / 2 - 1--->( x / 2 - 1) / 2 - 1 (第二天早上又将剩下的桃子吃掉一半,又多吃了一个) |
...... | (以后每天早上都吃了前一天剩下的一半加一个。) |
N | 1 (到第N天早上想再吃时,见只剩下一个桃子了。) |
由此,f ( N ) = 1,
f (1) = x / 2 - 1;
f (2) = ( x / 2 - 1 ) / 2 - 1;
让我们来看看f (2) 和 f (1) 的关系,f (1) = ( f (2) + 1 ) * 2;
由此可知,f (N - 1) = ( f (N) + 1 ) * 2;
int f(int N){
int i=N-1,f=1;
for(;i>=1;i--){
f=2*(f+1);
}
return f;
}
这就是一个计算 N-1 次加一乘二的过程。
PS:我差点把他当成递归函数了( ̄_ ̄|||)。