函数05 – 零基础入门学习C语言36
第七章:函数05
让编程改变世界
Change the world by program
函数的嵌套调用
嵌套定义就是在定义一个函数时,其函数体内又包含另一个函数的完整定义。
然而,C语言不能嵌套定义函数,但可以嵌套调用函数,也就是说,在调用一个函数的过程中,又调用另一个函数。
main()
{
a();
}
a()
{
b();
}
b()
{
return;
}

函数的嵌套调用
例题:

函数的嵌套调用
思路:
本题可编写两个函数,一个是用来计算平方值的函数square,另一个是用来计算阶乘值的函数factorial。
主函数先调square计算出平方值,再在square中以平方值为实参,调用 factorial计算其阶乘值,然后返回square,再返回主函数,在循环程序中计算累加和。
递归递归!!
在调用一个函数的过程中又出现直接或间接地调用该函数本身,称为函数的递归调用。C语言的特点之一就在于允许函数的递归调用。
例如:
int f(int x)
{
int y, z;
z = f(y);
return 2 * z;
}
说到递归,小甲鱼想到一个古老的故事: 山上有座庙,庙里有个小和尚和一个老和尚,有一天老和尚对小和尚说:“山上有个庙,庙里有个小和尚和一个老和尚,有一天老和尚对小和尚说:“山上有座庙……………………””
我们可以看出:递归必须要有一个退出的条件!
递归例题
用递归的方法求 n!
求n!也可以用递归方法,即5!等于4!×5,而4!=3!×4…1!=1。可用下面的递归公式表示:
n = 1 ( n = 0 )
n * (n-1)! ( n > 1)
程序详解
程序中给出的函数recursion()是一个递归函数。主函数调用recursion()后即进入函数recursion()执行。
如果n
由于每次递归调用的实参为n-1,即把n-1的值赋予形参n,最后当n-1的值为1时再作递归调用,形参n的值也为1,将使递归终止。然后可逐层退回。
我们这道例题也可以不用递归的方法来完成。
如可以用迭代法,即从1开始乘以2,再乘以3…直到n。递推法比递归法更容易理解和实现。
递归算法是效率低下的算法!!
但是有些问题则只能用递归算法才能实现。典型的问题是Hanoi塔问题。
汉诺塔难题
Hanoi(汉诺)塔问题。这是一个古典的数学问题,是一个用递归方法解题的典型例子。问题是这样的:古代有一个梵塔,塔内有3个座A、B、C,开始时A座上有64个盘子,盘子大小不等,大的在下,小的在上(见图)。

汉诺塔难题,C语言递归实现
有一个老和尚想把这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座上。
视频下载
技术, IT技术, 视频教程, C语言
风险提示及免责条款
市场有风险,投资需谨慎。本文不构成个人投资建议,也未考虑到个别用户特殊的投资目标、财务状况或需要。用户应考虑本文中的任何意见、观点或结论是否符合其特定状况。据此投资,责任自负。本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处。如若内容有涉嫌抄袭侵权/违法违规/事实不符,请点击 举报 进行投诉反馈!
