猴子吃桃问题
问题描述
有一只猴子第一天摘下若干个桃子,当即吃掉了一半,有多吃了一个;第二天又将剩下的桃子吃掉一半,有多吃了一个;按照这样的吃饭每天都吃掉前一天剩下的一半又多一个。到了第10天,就剩下一个桃子。问题,这个桃子第一天摘了多少个桃子。
递推算法
#include <stdio.h>
int main() {
int n;
while (scanf("%d", &n)) {
int ans = 1;
for (int i=1; i<n; i++) {
ans = ans*2 + 2;
}
printf("%d\n", ans);
}
return 0;
}
算法分析:
key | value |
---|---|
测试输入 | 10 |
测试输出 | 1534 |
时间复杂度 | O(N) |
空间复杂度 | O(1) |
-
时间复杂度:
-
Space(N) = Heap(N) + Stack(N)
Heap(N):额外申请堆内存的空间大小 Stack(N): 表示函数栈的最大深度
由于此处没有申请额外堆内存空间,且函数栈的最大深度为1,所以时间复杂度为1。
递归算法
#include <stdio.h>
int fruit_num(int i){
if(i==1)
return 1;
else
return 2*fruit_num(i-1)+2;
}
int main(){
int n;
while (scanf("%d", &n)) {
int ans = fruit_num(n);
printf("%d", ans);
}
return 0;
}
算法分析:
key | value |
---|---|
测试输入 | 10 |
测试输出 | 1534 |
时间复杂度 | O(N) |
空间复杂度 | O(N) |
-
时间复杂度:
-
Space(N) = Heap(N) + Stack(N)
Heap(N):额外申请堆内存的空间大小 Stack(N): 表示函数栈的最大深度
由于此处没有申请额外堆内存空间,且函数栈的最大深度为N,所以时间复杂度为N。
栈的深度测试:
#include <stdio.h>
int fruit_num(int i){
printf("函数 %d进栈\n", i);
if(i==1){
printf("函数%d弹栈\n", i);
return 1;
}
else{
int ans = 2*fruit_num(i-1)+2;
printf("函数%d弹栈\n", i);
return ans;
}
}
int main(){
int n;
while (scanf("%d", &n)) {
int ans = fruit_num(n);
printf("%d\n", ans);
}
return 0;
}
结果:
函数 10进栈
函数 9进栈
函数 8进栈
函数 7进栈
函数 6进栈
函数 5进栈
函数 4进栈
函数 3进栈
函数 2进栈
函数 1进栈
函数1弹栈
函数2弹栈
函数3弹栈
函数4弹栈
函数5弹栈
函数6弹栈
函数7弹栈
函数8弹栈
函数9弹栈
函数10弹栈
1534
三目运算化简代码
#include <stdio.h>
int fruit_num(int i){
return i==1?1:2*fruit_num(i-1)+2;
}
int main(){
int n;
while (scanf("%d", &n)) {
int ans = fruit_num(n);
printf("%d\n", ans);
}
return 0;
}
-
时间复杂度:
-
Space(N) = Heap(N) + Stack(N)
Heap(N):额外申请堆内存的空间大小 Stack(N): 表示函数栈的最大深度
由于此处没有申请额外堆内存空间,且函数栈的最大深度为N,所以时间复杂度为N。