解题思路:
本题给我们的思路是通过递归来解决,其实我们可以自己摸索出为什么用递归。
题目中给出的有两个部分,大母牛和小母牛,求出的是两者之和。并且我们能发现小母牛第四年能够成为大母牛且产下小母牛。
于是和解数学规律题一样,列出不同年份母牛的总数,并且细化大小母牛分别的数量。
种类\年份 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
大母牛 | 1 | 1 | 1 | 1 | 2 | 3 | 4 |
小母牛 | 0 | 1 | 2 | 3 | 4 | 6 | 9 |
总数 | 1 | 2 | 3 | 4 | 6 | 9 | 13 |
我是分两部分来看的,一部分是第四年之前,另一部分是之后。很明显,第一部分只用返回对应年份的数值就行了。
重点在第二部分:(从第四年这个零界点开始)
1)4 = 1 +3
2)6 = 2 +4
3)9 = 3 +6
4)13=4 +9
我们可以发现,式子的第一项自然增加,第二项正好等于f(n-1),按如此去看看第一项的规律,可以发现第一项等于f(n-3)
于是f(n)=f(n-1)+f(n-3).
注意事项:
1)在明白了这样的规律如何得出来的,现在就只剩敲码了。
实例时输入一连串数,且由回车分割,输入0则只输出0之前的数字。
这意味着我们需要构建一个数组,先处理输入再处理输出。
2)注意年份小于55,也就是说定义的数组只有54个项
参考代码:
#include <stdio.h>
int DOT(int n)
{
if (n <= 4)
{
return n; //不大于4时直接返回值
}
else
{
return DOT(n - 1) + DOT(n - 3); //用发现的规律直接带入
}
}
int main()
{
int n=0,i=0;
int array[54] = { 0 };
while(i<55)
{
scanf_s("%d", &array[i]); //输入
if (array[i] == 0)break; //为零时结束输入
i++;
}
n = i;
i = 0;
while (i<n)
{
printf("%d\n", DOT(array[i])); //输出
i++;
}
return 0;
}
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复