第七章:函数05

让编程改变世界

Change the world by program


函数的嵌套调用

嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数的完整定义。 然而,C语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。 [codesyntax lang="c"]

main()
{a();
}a()
{b();
}b()
{return;
}

[/codesyntax]   [caption id="attachment_127" align="aligncenter" width="300"] 函数的嵌套调用[/caption]

例题:

[caption id="attachment_128" align="aligncenter" width="300"] 函数的嵌套调用[/caption]

思路:

本题可编写两个函数,一个是用来计算平方值的函数square,另一个是用来计算阶乘值的函数factorial。 主函数先调square计算出平方值,再在square中以平方值为实参,调用 factorial计算其阶乘值,然后返回square,再返回主函数,在循环程序中计算累加和。

递归递归!!

在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。 例如: [codesyntax lang="c"]

int f(int x)
{int y, z;z = f(y);return 2 * z;
}

[/codesyntax] 说到递归,小甲鱼想到一个古老的故事: 山上有座庙,庙里有个小和尚和一个老和尚,有一天老和尚对小和尚说:“山上有个庙,庙里有个小和尚和一个老和尚,有一天老和尚对小和尚说:“山上有座庙……………………”” 我们可以看出:递归必须要有一个退出的条件!

递归例题

用递归的方法求 n!

求n!也可以用递归方法,即5!等于4!×5,而4!=3!×4…1!=1。可用下面的递归公式表示:

n = 1 ( n = 0 )

n * (n-1)! ( n > 1)

程序详解

程序中给出的函数recursion()是一个递归函数。主函数调用recursion()后即进入函数recursion()执行。 如果n<0,n==0或n=1时都将结束函数的执行,否则就递归调用ff函数自身。 由于每次递归调用的实参为n-1,即把n-1的值赋予形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。   我们这道例题也可以不用递归的方法来完成。 如可以用迭代法,即从1开始乘以2,再乘以3…直到n。递推法比递归法更容易理解和实现。   递归算法是效率低下的算法!! 但是有些问题则只能用递归算法才能实现。典型的问题是Hanoi塔问题。

汉诺塔难题

Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(见图)。 [caption id="attachment_129" align="aligncenter" width="300"] 汉诺塔难题,C语言递归实现[/caption]   有一个老和尚想把这64个盘子从A座移到C座,但每次只允许移动一个盘,且在移动过程中在3个座上都始终保持大盘在下,小盘在上。在移动过程中可以利用B座,要求编程序打印出移动的步骤。   为便于理解,我们先分析将A座上3个盘子移到C座上的过程: (1) 将A座上2个盘子移到B座上(借助C); (2) 将A座上1个盘子移到C座上; (3) 将B座上2个盘子移到C座上(借助A)。 其中第(2)步可以直接实现。第1步又可用递归方法分解为: 1.1 将A上1个盘子从A移到C; 1.2 将A上1个盘子从A移到B; 1.3 将C上1个盘子从C移到B。 第(3)步可以分解为: 3.1 将B上1个盘子从B移到A上; 3.2 将B上1个盘子从B移到C上; 3.3 将A上1个盘子从A移到C上。   将以上综合起来,可得到移动3个盘子的步骤为 A→C,A→B,C→B,A→C,B→A,B→C,A→C。 由上面的分析可知:将n个盘子从A座移到C座可以分解为以下3个步骤: (1) 将A上n-1个盘借助C座先移到B座上。 (2) 把A座上剩下的一个盘移到C座上。 (3) 将n-1个盘从B座借助于A座移到C座上。   [buy] 获得所有教学视频、课件、源代码等资源打包 [/buy] [Downlink href='http://kuai.xunlei.com/d/LWHRGQEQDGMU']视频下载[/Downlink]

转载于:https://www.cnblogs.com/LoveFishC/archive/2010/12/08/3846980.html

函数05 - 零基础入门学习C语言36相关推荐

  1. 指针05 - 零基础入门学习C语言45

    第八章:指针05 让编程改变世界 Change the world by program 字符串与指针 (1) 用字符数组存放一个字符串,然后输出该字符串. 例题一:定义一个字符数组,对它初始化,然后 ...

  2. 循环控制结构程序05 - 零基础入门学习C语言20

    第五章:循环控制结构程序05 让编程改变世界 Change the world by program break和continue语句 break语句 break语句可以用来从循环体内跳出循环体,即提 ...

  3. 结构体与共用体05 - 零基础入门学习C语言57

    第十章:结构体与共用体05 让编程改变世界 Change the world by program 对链表结点的删除操作实现 实现源代码: [codesyntax lang="c" ...

  4. 函数09 - 零基础入门学习C语言40

    第七章:函数09 让编程改变世界 Change the world by program 课件同上一讲,详细讲解请看视频. [buy] 获得所有教学视频.课件.源代码等资源打包 [/buy] [Dow ...

  5. 函数04 - 零基础入门学习C语言35

    第七章:函数04 让编程改变世界 Change the world by program 上节课的练习简单讲解,给力!! 1.自己实现pow()函数并尝试验证--   2.猜想下sqrt()函数的原理 ...

  6. 分支程序设计05 - 零基础入门学习C语言14

    第四章:分支程序设计05 让编程改变世界 Change the world by program switch语句 练习1:输入三个整数,输出最大数和最小数. 答案与解析: [codesyntax l ...

  7. 函数03 - 零基础入门学习C语言34

    第七章:函数03 让编程改变世界 Change the world by program 函数的调用 函数调用的一般形式 函数调用的一般形式为: 函数名(实参表列)   如果是调用无参函数,则&quo ...

  8. 零基础入门学习C语言

    注:这些都是我辛苦找的资料,希望能对大家有帮助,然后就是大家选择性的下载!我个人推荐小甲鱼20G的那个,一整套!还带工具和众多电子书!全部都是免费的! 郝斌先生的视频讲解也很仔细,但是没有实践作业布置 ...

  9. 零基础入门学习C语言008讲:函数(4)

    8.7数组作为函数参数 数组可以作为函数的参数使用,进行数据传送.数组用作函数参数有两种形式. 一种是把数组元素(下标变量)作为实参使用: 另一种是把数组名作为函数的形参和实参使用. 8.7.1 数组 ...

最新文章

  1. H3 BPM钉钉接入配置
  2. 世界顶级摄影作品,构图的最高境界!
  3. 数字证书原理,公钥私钥加密原理
  4. gmr 通信 matlab,matlab使用TCP/IP Server Sockets
  5. JavaOne 2015 –又一年,又向前迈进了一步
  6. 怎么才能点一下excel中的超链接就显示出图片?_Excel如何批量建立超链接,搭建工作台...
  7. 2017-9-5-Java 泛型
  8. SGI版本空间配置器
  9. mysql时间总结_MYSQL日期时间总结
  10. bootstrap-multiselect.js插件、chosen插件、clipboard复制插件、layer.photos、lightbox插件相册预览插件学习
  11. 【Java面试】第二章:P5级面试
  12. Three.js - 加载 .OBJ 格式模型(十六)
  13. preparedstatement mysql 数据_使用PreparedStatement对象操作数据库
  14. ios 图片加载内存尺寸_iOS图片内存优化
  15. 主谓宾定状补......
  16. fbx 模型转换 export
  17. anaconda创建新环境
  18. vlan聚合---supper vlan
  19. Python修改论文的字体及其大小
  20. unable to negotiate with xxxxx port xxx: no matching host key type found. Their offer: ssh-rsa

热门文章

  1. 快过年了,为过完年跳槽的人准备一份面试题
  2. closurescallbacks
  3. java8中的时间处理6 - 格式化
  4. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 数据库报错
  5. 使用XMLSpyDocEditPlugIn2.dll,页面加载失败
  6. 定义一个属性_Python property属性
  7. next.js_Next.js手册
  8. 我是“真正的”软件工程师吗?
  9. 以太坊去中心化_开发以太坊去中心化投票应用程序的指南
  10. 如何获取boss直聘搜索牛人被屏蔽的姓名