国家级精品课程网站(精)
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
7
// 函数 hanoi():将n片金片由p1借助p2移到p3上 void hanoi(int n, char p1, char p2, char p3) { if(n==1) move(p1, p3); else { hanoi(n-1, p1, p3, p2); move(p1, p3); hanoi(n-1, p2, p1, p3); } }
11
int main() { int x1 = 1; double x2 = -2.5; long x3 = 3L; cout << "|x1| = " << abs(x1) << endl; cout << "|x2| = " << abs(x2) << endl; cout << "|x3| = " << abs(x3) << endl; return 0; }
算 法:
如果只有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个了。这是 一个典型递归算法。
8
// 测试用主函数
int main() { hanoi(N, 'A', 'B', 'C'); return 0; }
9
7.2 函数重载
函数重载
一组参数和返回值不同的函数共用一个函数名。
函数重载使一个函数名具有多种功能,即具有“多 种形态”,称这种形态为多态性。 当某个函数中调用到重载函数时,编译器会根据实 参的类型去对应地调用相应的函数。匹配过程如 下:
12
7.3 指针和函数
一. 指针作为函数的参数 二. 返回指针的函数 三. 指向函数的指针
13
一. 指针作为函数的参数
函数的参数不仅可以是基本数据类型的变量、对象 名、数组名或函数名,而且可以是指针。 通过使实参与形参指针指向共同的内存空间,达到 了参数双向传递的目的
14
二. 返回指针的函数
函数返回值也可以是一个地址 (如变量、数组和函 数的地址,指针变量的值等)。 在说明返回值为地址的函数时,要使用指针类型说 明符,例如:
1、递归调用
一个函数自己调用自己,这种调用称为递归调用。
2、递归调用的方式
(1)直接调用其本身 (2)通过其他函数间接地调用
2
3、一个问题是否可以转换为递归来处理必须满足以下条件:
(1)必须包含一种或多种非递归的基本形式; (2)一般形式必须能最终转换到基本形式; (3)由基本形式来结束递归。
递归调用在堆栈中临时占据的存储区域是较多的,在实际运 行时,递归调用的时间效率较差。
(1)如果有严格匹配的函数,就调用该函数; (2)参数内部转换后如果匹配,调用该函数; (3)通过用户定义的转换寻求匹配。
10
例7-3 重载绝对值函数
#include <iostream> using namespace std; int abs(int x) { return x>=0?x:-x; } double abs(double x) { return x>=0?x:-x; } long abs(long x) { return x>=0?x:-x; }
char *strchr(char *string, int c); char *strstr(char *string1, char *string2);
15
例7-4 将月份数值转换为相应的英文 名称
char *month_name(int n) {static char *month[]= {"Illegal month", "January", "February", "March", "April", "May", "June", "July", "August", "September","October", "November", "December" }; return (n>=1 && n<=12)?month[n]:month[0]; }
16
void main( ) { cout<<endl; cout<<month_name(3); cout<<“ 15,2000”; }
17
三. 指向函数的指针
首地址是函数的入口地址。主函数在调用子函数时, 就是让程序转移到函数的入口地址开始执行。 指向函数的指针:就是指针的值为该函数的入口地 址。
18
指向函数的指针变量的说明格式为:
<函数返回值类型说明符> (*<指针变量名>)(<参数说 明表>);
例如:
int(*p)(); // p为指向返回值为整型的函数的指针 float(*q)(float,int); // q为指向返回值为浮点型函数的 指针
3
例7-1 采用递归算法求n!
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 }
4
例7-2 梵塔(hanoi塔)问题
5
Leabharlann Baidu
6
[例8-2] 梵塔(hanoi塔)问题
#include <iostream> using namespace std; const int N=3; //考察当金片数为3个时的情况 // 函数move():将金片由一根针移到另一根针上 void move(char from, char to) { cout << "From "<< from << " to " << to << endl; }
国家级精品课程网站
(本书配套教学网站)
http://programming.xjtu.edu.cn
第7章 函数与指针
7.1 递归函数 7.2 函数重载 7.3 指针和函数 7.4 带参数的main()函数 7.5 内联函数 7.6 无参函数 7.7 void和const类型的指针
1
7.1 递归函数