问题描述:

有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁。问第4个人多少岁,他说比第3那个人大2岁。问第3个人多少岁,他说比第2个人大2岁。问第2个人多少岁,他说比第1个人大2岁。最后问第一个人,他说他是10岁。编写程序,当输入第几个人时求出其对应的年龄。

问题分析:

该问题是一个递归问题。要求第五个人的年龄,必须先知道第4个人的年龄,显然第4个人的年龄也是未知的,但可以有第3个人的年龄推算出来。而想知道第3个人的年龄又必须先知道第2个人的年龄,第2个人的年龄则取决于第1个人的年龄。

又已知每个人的年龄都比其前一个人的年龄大2,因此根据题意,可得到如下几个表达式:

age(5)=age(4)+2

age(4)=age(3)+2

age(3)=age(2)+2

age(2)=age(1)+2

age(1)=10

归纳上面5个表达式,用数学公式表达出来为:

age(n)=age(n-1)+2

求解第n个人的年龄分成两个阶段。第一个阶段是“回推”过程,第二个阶段是“递推”过程。

在“回推”过程中,利用的是n>1时的公式age(n-1)+2。要求的是第n个人的年龄,因此首先将第n个人的年龄回推到第n-1个人的年龄,但第n-1个人的年龄仍然未知,因此需要继续回推到第n-2个人的年龄,第n-2个人的年龄仍然未知,需要继续向前回推,如此下去,已知回推到第1个人的年龄。而第1个人的年龄是已知的,因此,第一阶段的“回推”结束。

在“递推”过程中,从第1个人的年龄可以退出第二个人的年龄,从第2个人的年龄可以推出第3个人的年龄,如此下去一直递推到第5个人的年龄。

算法设计:

理解了问题分析中的递归处理过程后,算法设计就非常简单了。只需要将公式转换成一个函数,然后用main() 函数调用它就可以了。

下面是完整的代码:

#include <stdio.h>

int age(int n)

{

int x;

if(n == 1)

x = 10;

else

x = age(n - 1) + 2;

return x;

}

int main()

{

int n;

printf("请输入n值:");

scanf("%d",&n);

printf("第%d个人的年龄为%d\n",n,age(n));

return 0;

}

运行结果:

请输入n值:5

第5个人的年龄为18

知识点补充:

由该题的分析过程可知,递归的问题都可以分为“回推”和“递归”两个阶段。而且必须存在一个能够结束递归过程的条件,如本题中的age(1)=10,否则递归过程会无限制地进行下去而无法结束。

下面对递归法做下总结。

递归是设计和描述算法的一种强有力的工具。能够采用递归来描述的算法通常具有如下的特征:为求解规模为n的问题,首先要将它分解成规模较小的问题,然后通过这些小问题的解,能够方便的构造出大问题的解。

同时,这些规模较小的问题也能够采取同样的分解方法分解成规模更小的问题,并能够通过这些更小的问题的解构造出规模较大的问题的解。特别地,当问题规模n=0或n=1时,能直接获得问题地解。

递归算法地执行过程分为“回推”和“递归”两个阶段:

在回推阶段,是把较复杂地问题(规模为n)的求解递归到比原问题简单一些的问题(规模小于n)的求解。例如本例中,要求解age(n),先把它递推到求解age(n-1),而要计算age(n-1),又必须先计算age(n-2),依次类推,直到计算age(1)为止。需要注意的是,在递推阶段,必须要有能够终止递归的条件。如本例中n为1时,递推可终止。

在递推阶段,当获得最简单情况的解时,如本题中得到age(1)的值,逐级返回,依次得到较复杂问题的解,最终获得所求问题的解。

在编写递归函数时需要注意,函数中定义的局部变量和形式参数只在当前的调用层有效,当回推到简单问题时,原来调用层中的局部变量和参数都被隐藏起来。每一个简单问题层中都有自己的局部变量和参数。

此文章内容以及实例来源于《c语言学习app》,谢谢共享

递归解决年龄问题---c语言实现相关推荐

  1. 100个python算法超详细讲解:递归解决年龄问题

    [100个python算法超详细讲解]@谷哥技术 1.问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问 第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个 人大2 ...

  2. C语言:递归解决年龄问题(精细版)

    问题: 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个人大2岁.问第2个人多少岁,他说比第1个人大2岁.最后问第1个人, ...

  3. 2.递归解决年龄问题

    问题描述 有5个人坐在一起,问第5个人多少岁,他说比第4个人大2岁.问第4个人多少岁,他说比第3个人大2岁.问第3人多少岁,他说比第2个人大2岁.问第2个人多少岁,他说比第1个人大2岁.最后问第1个人 ...

  4. 速归解决年龄问题c语言,队危速归,VG官宣Kkoma教练离队,T1和李哥需要我?

    大家都知道,每年的全球总决赛之后都会有大量的选手或者教练选择退役或者更换队伍,但是没想到今年的全球总决赛还没开始,VG就打响了第一炮,在今天,VG官方宣布传奇教练Kkoma因为个人家庭原因需要返回韩国 ...

  5. c语言递归汉诺塔次数,c语言递归解决汉诺塔参数变化的疑惑

    c语言递归解决汉诺塔参数变化的疑惑 答案:3  信息版本:手机版 解决时间 2020-04-05 14:20 已解决 2020-04-05 10:49 #include void main() {vo ...

  6. c语言递归解决汉诺塔问题

    c语言递归解决汉诺塔问题 参考文章: (1)c语言递归解决汉诺塔问题 (2)https://www.cnblogs.com/didiaoxiaoguai/p/6686407.html 备忘一下.

  7. 【C语言】利用递归解决猴子吃桃问题

    [C语言]利用递归解决猴子吃桃问题 参考文章: (1)[C语言]利用递归解决猴子吃桃问题 (2)https://www.cnblogs.com/ieybl/p/6597937.html 备忘一下.

  8. Java 递归解决 quot;仅仅能两数相乘的计算器计算x^yquot; 问题

    Java 递归解决 "仅仅能两数相乘的计算器计算x^y" 问题 /*** 求一个数的乘方* 求x^y,y是一个正整数. 设计算器仅仅能计算两数相乘,不能一次计算n个数相乘. * 知 ...

  9. python3数字全排列怎么搞_python使用递归解决全排列数字示例

    第一种方法:递归 复制代码 代码如下: def perms(elements): if len(elements) <=1: yield elements else: for perm in p ...

最新文章

  1. DataSnap如何监控Tcp/IP客户端的连接情况
  2. FreeRTOS系列第1篇---为什么选择FreeRTOS?
  3. 时间、时间戳相关小结 - iOS
  4. 判断一个无符号整数是不是2的n次幂的幂
  5. Java Web开发技术教程入门-JavaBean组件与Servlet
  6. c语言酒店管理系统设计目的,C语言酒店管理系统设计.doc
  7. k-center 聚类
  8. java中char和string的区别是什么
  9. 黑马博客——详细步骤(十二)项目功能的实现之文章评论和退出功能
  10. mybatis批量操作
  11. cpc专利电子申请客户端安装教程以及常见错误
  12. ORACLE 锁解释
  13. 2021年CentOS7安装Oracle11g全记录
  14. 鸿蒙断更术辰东,辰东笔下的“6大绝世功法”,六七八九法术,最后一个让石昊绝望...
  15. 解锁三星bl锁有几种方法_三星Note5解锁教程_三星Note5 CROM解BL锁的方法
  16. python利用表格中的某一个列_python取excel表格第一列数据?python操作excel,使用xlrd模块,获取某一列数据的语句为...
  17. cad线加粗怎么设置_CAD图纸线条粗细如何修改?CAD图纸线宽如何调整?
  18. 小米WatchS2和小米WatchS1 区别 哪个值得入手
  19. SWFUpload 使用说明
  20. Vue报错:Uncaught (in promise) ReferenceError Message is not defined at eval

热门文章

  1. Messager for grace
  2. 一看就懂的vue简版源码概述
  3. Shopee开店不懂英语怎么办?
  4. 用于图像语义分割的GAU与PPM
  5. div上下左右居中老调重弹
  6. 田纳西大学计算机科学,田纳西大学_田纳西大学(University of Tennessee)
  7. C++产生随机数的几种方法
  8. LOJ#2427. 「POI2010」珍珠项链 Beads
  9. 软件工程复试——二、可行性研究
  10. Spring 源码分析(一) —— 迈向Spring之路