- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
说明: ① 从输出结果看,阶乘增加得非常快,7 以上的阶乘就超过了int类型的取值范围,这就是为什么要把返回值的类型定义为long int的原因,相应的输出格式是′%ld′。如果要求更大数的阶乘,可以选用float或double作为阶乘函数返回值类型。 ② 求阶乘函数中有个核心语句:双分支的if语句。其中的一个分支描述的是边界条件,另一个分支是递归调用。在递归调用中又出现了该函数的函数名,但这里的参数比函数头中的参数就简单了一些,这就是递归函数的书写模式。对于大多数递归函数,都可以这样考虑和书写。 在递归函数体中还可以出现不只一个的递归调用,它们各自有不同的参数。 【例5-19】 求Fibonacci数列:1,1,2,3,5,8,13,… 观察数列,可发现这样的规律:从第 3 项开始,每一项都是其前面两项之和。设fib(n)[JP]表示第n个Fibonacci数,则有: fib(n)=1 (n=1或n=2) fib(n)=fib(n-1)+fib(n-2) (n≥3) Fibonacci数列是个很有趣的数列,随着项数的增加,前后相邻两项的比值趋向于0.618,这个比值被称为“黄金分割”。建筑师经常用黄金分割来指导设计门窗、 房间和建筑物等,人们认为符合黄金分割的物体是一种美的物体。 Fibonacci函数的数学表达式已清楚地表明这是个递归问题,因此可以很容易地用C语言写出它的递归函数。 #include stdio.h long fib(int); main() { long bf; int n; printf(″Enter an integer: \n″); scanf(″%d″, n); bf=fib(n); printf(″Fibonacci(%d)=%ld″, n, bf); return 0; } long fib(int m) {if (m==1‖m==2) return 1; else return fib(m-1)+fib(m-2); } 运行输出: Enter an integer: 8↙ Fibonacci(8)=21 fib函数的递归调用如图5-17所示(这里是求fib(5))。 图5-17 求fib(5)的递归调用 对符合边界条件的基本问题可直接求出其解。 这里涉及到对操作数求值的次序问题。在fib(3)=fib(2)+fib(1)中,是先计算fib(2)还是先计算fib(1),ANSI C标准对此没有作出明确的规定,因此程序可对调用顺序不作任何假定。对本程序和大多数程序而言,计算结果都是正确的,但在某些程序中,操作数的运算顺序可能会影响表达式的最终结果。 在C语言的所有运算符中,ANSI C只规定了下面四种运算符对操作数的求值顺序:、‖、逗号和?:。前三个运算符是双目运算符,按从左到右的顺序计算它的两个操作数。最后一个是C语言中惟一的一个三目运算符,它最左边的操作数优先运算。至于其他运算符操作数的求值顺序,不同的系统有不同的规定。因此如果编写的程序依赖于操作数的求值顺序,将可能导致错误,因为编译器的执行顺序不一定会和编程者的想法一致。 另外,递归函数的调用次数也是个值得注意的问题。以本题为例,每次递归调用fib函数都要再递归地调用两次,因此当n很大时,对fib函数的调用次数将是惊人的,所以应该避免编写像fib函数这样的递归函数,即使要编写,参数也不应很大。 【例5-20】 把一个正整数的各位数字以字符形式输出。 #include stdio.h void digit(int); main() { int m; printf(″Input an integer:\n″); scanf(″%d″, m); digit(m); return 0; } void digit(int n) { if(n==0) return; else { digit(n/10); putchar(n%10+′0′); } } digit()是个递归函数,其参数为n,而在该函数中又以n/10为参数进行递归调用,则调用是向参数减少的方向变化的。当n变为0时,达到边界条件,递归调用结束,开始回退。在回退的过程中输出相应的字符
您可能关注的文档
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第1章 概述.ppt
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第2章 窗体.ppt
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第3章 基本控件.ppt
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第4章 Visual Basic程序设计基础.ppt
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第5章 基本控制语句.ppt
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第6章 程序设计基本算法.ppt
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第7章 高级数据类型.ppt
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第8章 过程.ppt
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第9章 文件.ppt
- 程序设计基础——Visual Basic教程 第2版 教学课件 作者 周黎 钱瑛 周阳花 第10章 高级控件.ppt
- 程序设计与C语言 第二版 教学课件 作者 马鸣远 封面及目录.ppt
- 冲压模具设计项目教程 教学课件 作者 袁小江 项目二.ppt
- 冲压模具设计项目教程 教学课件 作者 袁小江 项目三.ppt
- 冲压模具设计项目教程 教学课件 作者 袁小江 项目四.ppt
- 冲压模具设计项目教程 教学课件 作者 袁小江 项目五.ppt
- 冲压模具设计项目教程 教学课件 作者 袁小江 项目一.ppt
- 冲压模具设计项目教程 教学课件 作者 袁小江 绪论.ppt
- 冲压模具设计与实践 教学课件 作者 范建蓓 教学单元八 冲压工艺制定与模具设计综合实践.ppt
- 冲压模具设计与实践 教学课件 作者 范建蓓 教学单元二 冲裁工艺与冲裁模设计.ppt
- 冲压模具设计与实践 教学课件 作者 范建蓓 教学单元六 其它成形工艺与模具设计.ppt
文档评论(0)