文章目录
0x00 前言
0x01 题目描述
0x02 问题分析
0x03 代码设计
0x04 完整代码
0x05 运行效果
0x06 总结
0x00 前言
C 语言网不仅提供 C 语言,还包括 C++ 、 java 、算法与数据结构等课程在内的各种入门教程、视频录像、编程经验、编译器教程及软件下载、题解博客,源码分享等优质资源,提倡边学边练边分享,同时提供对口的IT工作,是国内领先实用的综合性编程学习网站!
0x01 题目描述
题目内容:
有一头母牛,它每年年初生一头小母牛。每头小母牛从第四个年头开始,每年年初也生一头小母牛。请编程实现在第n年的时候,共有多少头母牛?
输入格式:
输入数据由多个测试实例组成,每个测试实例占一行,包括一个整数n(0<n<55),n的含义如题目中描述。 n=0表示输入数据的结束,不做处理。 |
输出格式:
对于每个测试实例,输出在第n年的时候母牛的数量。 每个输出占一行。 |
样例输入:
2 4 5 0 |
样例输出:
2 4 6 |
0x02 问题分析
关于递归母牛的故事给出以下示例:
Year | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 |
cow | 1 | 2 | 3 | 4 | 6 | 9 | 13 | 19 | 28 | 41 | 60 | 88 |
递推数列公式:
这种题目属于斐波那契数列的变种,斐波那契数列递推式是前一项与前两项相加的和。那么计算斐波那契数列使用函数递归的方法会更清晰易懂。
0x03 代码设计
int cow(int n)
{
if(n < 4)
{
return n;
}
else
{
return cow(n - 1) + cow(n - 3);
}
}
代码解析:定义一个整数函数 cow 用来计算母牛数量,在函数内部定义一个整数 n 用于接受一个传递参数值,在主函数中可以在函数内部 cow() 使用任意合法数字进行参数传递,如果整数 n 接收到传递后的参数就会执行函数体中的代码块。使用 if 判断接收到的整数 n 是否小于 4 ,如果小于 4 则返回 n 。否则返回 cow(n-1) + cow(n-3) ,这是一个表达式,表示调用 cow 函数两次,并相加。为什么要这么做,因为计算母牛数量每年增长规律是前一年的母牛数加上前三年母牛数的和。
int main()
{
int n, i, j;
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
j = cow(i);
}
printf("%d", j);
return 0;
}
代码解析:在主函数中定义一个整数 n ,用于获取用户输入;定义一个整数 i 用于循环计算;定义一个整数 j 用于赋值。第四行代码使用 scanf 函数获取用户输入。第五行代码使用 for 循环构造一个 1-n 的循环,如果循环到 n 之后则结束循环。否则继续循环。循环体中的代码块不断调用 cow 函数,并将 i 值赋给函数内部使用,最后的结果用变量 j 来保存。这里经过循环,函数就会从 cow(1) 开始运行,到最后 cow(n) 运行结束后结束 for 循环。例如 n = 5 ,那么代码到 6 时就不再执行循环。最后使用 printf 函数将保存在变量 j 内部的数值打印出来即可。
0x04 完整代码
#include<stdio.h>
int cow(int n)
{
if(n < 4)
{
return n;
}
else
{
return cow(n - 1) + cow(n - 3);
}
}
int main()
{
int n, i, j;
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
j = cow(i);
}
printf("%d", j);
return 0;
}
0x05 运行效果
5
6
--------------------------------
Process exited after 0.7536 seconds with return value 0
请按任意键继续. . .
0x06 总结
文章内容为学习记录的笔记,由于作者水平有限,文中若有错误与不足欢迎留言,便于及时更正。