文档介绍:大学C++程序设计教程
西安交通大学
计算机教学实验中心.
第8章函数和指针
C++语言的模块设计离不开函数,函数设计更离不开参数。
掌握函数设计和调用的正确方法,是程序设计的基本功。
正确设计函数原型和参数类型,不仅能保证函数的正确性,而且能提高程序设计的效率。
介绍函数调用、递归调用以及函数调用中的参数替换和返回值等问题之外,还将结合软件编程技术的发展,讨论函数指针、内联函数、函数重载等。
理解指针和函数的几种关系
1
授课内容
递归函数
函数重载
指针和函数
带参数的main()函数
内联函数
不使用参数的函数
void和const类型的指针
2
一、递归函数
函数调用,一般是一个函数调用另外一个函数。此外,函数还可以自己调用自己,这种调用叫做函数的递归调用。
递归调用有两种方式,一种是直接调用其本身,另一种是通过其他函数间接地调用。
3
一个问题是否可以转换为递归来处理必须满足以下条件:
(1)必须包含一种或多种非递归的基本形式;
(2)一般形式必须能最终转换到基本形式;
(3)由基本形式来结束递归。
递归调用在堆栈中临时占据的存储区域是较多的,在实际运行时,递归调用的时间效率较差。
4
[例8-1] 采用递归算法求n!
算法:
由阶乘的概念可以写出其递归定义:
0! = 1
n! = n*(n-1)!
5
Example 8-1:用递归方法求n!
// 函数fac():求阶乘的递归函数
int fac(int n)
{
if(n<0) // 不能求负数的阶乘
return 1;
else if(n==0) // 0的阶乘为1
return 1;
else
return n*fac(n-1); // n!为(n-1)!乘以n
}
6
[例8-2] 梵塔(hanoi塔)问题
算法:
如果只有1片金片时,只要直接将金片从A针移到C针上即可;
当n>1时,就需要借助另外一个针来移动。将n片金片由A移到C上可以分解为以下几个步骤:
(1) 将A上的n1片金片借助C针移到B针上;
(2) 把A针上剩下的一片金片由A针移到C针上;
(3) 最后将剩下的n1个金片借助A针由B针移到C针上。
步骤(1)和(3)与整个任务类似,但涉及的金片只有n1个了。这是一个典型递归算法。
7
8
[例8-2] 梵塔(hanoi塔)问题
#include <>
const int N=3; //考察当金片数为3个时的情况
void move(char from, char to)
// 函数move():将金片由一根针移到另一根针上
{ cout << "From "<< from << " to " << to << endl;
}
9