问题描述:
问第五个学生,他说比第四个大两岁,问第四个学生,他说比第三个大两岁,一直重复,直到第一个,第一个说他10岁了。问:第五个学生多大?
思路分析:
- 先不着急写代码。先分析问题
- 由题目知道,只知道第一个孩子的年龄,且每个挨着的孩子之间年龄差2岁。
- 在主函数中,我们需要写一个函数,这个函数最后会返回我需要第n个孩子的年龄,即age(n)表示当前孩子年龄。
- 随后带着函数,去从题干中,提取规律。
- 我们发现:
- //age(5)=age(4)+2;
//age(4)=age(3)+2;
//age(3)=age(2)+2;
//age(2)=age(1)+2;
//age(1) = 10; - 第五个孩子,是比第四个孩子大2岁,所以第四个孩子年龄再加2.就这样一直往内递推,直到第一个孩子,说我是10岁啊,然后开始往上回归,挨个赋值,
- 即递推的两个关键条件:(1)结束递归的限制条件(2)每次递归所传递的值应是不断接近限制条件的。
- 这里满结束递归的限制条件,是n=1,而不断接近n=1的递归传递值,则是n-1.
代码如下:
#include <stdio.h>
//问题分析:
//问第五个学生,他说比第四个大两岁,问第四个学生,他说比第三个大两岁,一直重复,直到第一个,才说自己多大。
//如果我们写的函数,为计算学生的年龄,每一个传进的n为当前学生的年龄,那么可以写成
//age(5)=age(4)+1;
//age(4)=age(3)+1;
//age(3)=age(2)+1;
//age(2)=age(1)+1;
//age(1) = 10;
//可以知道,当n大于1时,有一个规律的式子为age(n)=age(n-1)+2;小于等于1的时候,直接age=10;
//此时此刻,已经知道的公式,直接照着写递归即可。
//突然想到,思考方式,我觉得应该先写主函数,然后看我们所需要的函数,是干什么的,如果最后我就需要返回学生的年龄。那么age(n)便表示第n个学生的年龄
//然后再带着这个意义,去思考上述公式,就容易发现规律了。
int age(int n)
{
if (n <= 1)
return 10;
else
return 2 + age(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int age_stu = age(n);
printf("第%d个学生的年龄为%d\n",n,age_stu);
}