心情:
今天看了一下计算机算法基础,居然觉得有点难的看懂,果然看书还是不怎么看的进去,打代码比较有兴趣。今天打了三个题目,比较基础,就这一道题觉得可以记一下笔记。
题目描述:
名名的妈妈从外地出差回来,带了一盒好吃又精美的巧克力给名名(盒内共有 N 块巧克力,20 > N >0)。 妈妈告诉名名每天可以吃一块或者两块巧克力。 假设名名每天都吃巧克力,问名名共有多少种不同的吃完巧克力的方案。 例如: 如果N=1,则名名第1天就吃掉它,共有1种方案; 如果N=2,则名名可以第1天吃1块,第2天吃1块,也可以第1天吃2块,共有2种方案; 如果N=3,则名名第1天可以吃1块,剩2块,也可以第1天吃2块剩1块,所以名名共有2+1=3种方案; 如果N=4,则名名可以第1天吃1块,剩3块,也可以第1天吃2块,剩2块,共有3+2=5种方案。 现在给定N,请你写程序求出名名吃巧克力的方案数目。
输入:
输入只有1行,即整数N
输出:
可能有多组测试数据,对于每组数据,
输出只有1行,即名名吃巧克力的方案数
如:
输入:
4
输出:
5
这道题不难,刚好今天学了关于递归的内容,一下子就想到了用递归的方法:
递归的变量:总的糖果数n
递归体:当你今天吃了一个糖果则剩下的糖果味n-1再进行递归,同理吃了两个糖果。。。。
递归出口:剩下一个糖果和没有糖果
代码如下:
int eatchocolate(int n){
if(n==0||n==1){
return 1;
}
return eatchocolate(n-1)+eatchocolate(n-2);
}
再聊聊非递归
实际上这题用递归会重复的执行了n-2,n-3。。。等的情况,实际上我们可以用一个数组进行存储,即 a[i] 表示 i 个糖果的方案,a[0]=1,a[1]=1
然后实际上n大于等于2都是前两个相加,用个循环即可。
代码如下:
int main()
{
int n;
cin>>n;
if(n==1){
cout<<1;
return 0;
}
int a[20];
a[0]=1;
a[1]=1;
for(int i=2;i<=n;i++){
a[i]=a[i-1]+a[i-2];
}
cout<<a[n];
return 0;
}