问题:

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

分析:

该问题是一个递归问题。要求第5个人的年龄,必须先知道第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个表达式,用数学公式表达出来为:

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

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

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

算法设计:

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

下面是完整的代码:

  1. #include<stdio.h>
  2. int age(int n)
  3. {
  4. int x;
  5. if(n == 1)
  6. x=10;
  7. else
  8. x=age(n-1)+2;
  9. return x;
  10. }
  11. int main()
  12. {
  13. int n;
  14. printf("请输入n值:");
  15. scanf("%d", &n);
  16. printf("第%d个人的年龄为%d\n", n, age(n));
  17. return 0;
  18. }

运行结果:
请输入n值:5
第5个人的年龄为18

知识点补充

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

以下对递归法的总结:

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

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

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

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

注意:

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

C语言:递归解决年龄问题(精细版)相关推荐

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

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

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

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

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

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

  4. 递归解决年龄问题---c语言实现

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

  5. 基础学习——C语言递归解决分鱼问题

    如有小伙伴想学习C语言基础,可以进群731871503进行交流学习,提升编程,共同进步 问题描述 A.B.C.D.E这5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了.第二 ...

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

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

  7. C语言递归解决杨辉三角,在大会递归解决杨辉三角(NCK)

    要解决你的递归的combi:的中间部分有一个问题: ... call combi pop cx ;stores to cx popped value combi(n-1,k) ;*^this free ...

  8. C语言递归解决十进制转换二进制

    1.解题思路 在纸上做过十进制转二进制的朋友应该都用的都是除二取余的方法,写出每一次的余数知道0为止再从下至上依次读取余数即可,类似下图 根据观察可知十进制转换为二进制的问题属于我上一篇文章所提到的& ...

  9. c语言5个人分鱼程序题,C语言递归解决5人分鱼问题

    问题描述A.B.C.D.E这5个人合伙夜间捕鱼,凌晨时都已经疲惫不堪,于是各自在河边的树丛中找地方睡着了.第二天日上三竿时,A第一个醒来,他将鱼平分为5份,把多余的一条扔回河中,然后拿着自己的一份回家 ...

最新文章

  1. android camera入门,android 基础一 Camera1 预览、拍照
  2. netstat [选项]
  3. LL-verilog语法:case用法
  4. cmd 切换目录_Linux Shell从入门到删除根目录跑路指南
  5. leetcode590. N叉树的后序遍历
  6. 李彦宏卸任百度云计算技术公司执行董事 崔珊珊接任
  7. Webview 非http或者https的网络请求拦截
  8. 微机实验——十字路口交通灯控制器
  9. 简历包装严重,作为面试官,我是如何甄别应聘者的包装程度
  10. 支付宝支付demo运行流程
  11. ASEMI的MOS管9N90参数,9N90电路图,9N90实物图
  12. 裸机linux分区,裸机装linux系统怎么操作?
  13. Java 7 - TWR 和 多异常捕获 示例
  14. kafka消费组和分区关系详解
  15. 机器学习系列(五) -- 逻辑回归(莺尾花数据集)
  16. 老挑毛u盘一键装系统计算机意外地,u盘装系统 重装Win7系统出现提示计算机意外的重新启动或遇到错误怎么处理 我已经删除了所有分...
  17. Error during export:Export job failed !
  18. matlab画出二维可行域,matlab中如何对线性规划不等式画图,以及标出可行域?
  19. linux服务器清除cdn,Linux服务器中查找并删除大文件的五种方法,Linux系统清除文件内容的命令分享...
  20. 关于计算机网络隐私的作文,网络安全小心作文

热门文章

  1. 【Springboot系列】Springboot接管所有Controller,magic-api源码阅读
  2. 手机开发实战99——MMS介绍6
  3. Plant Simulation使用技巧
  4. 拟募资超10亿元,索辰科技能否成为科创板CAE软件第一股?
  5. 2010最新会计科目表
  6. Python模拟登陆v2ex
  7. linux定时运行命令
  8. Java设计模式之(九)——门面模式
  9. 再寄小读者之数学篇[2014.07.01-2014.12.31]
  10. Java创建泛型数组的一种方法