一、函数重载
1、定义 C++中函数定义时可以重载,即定义多个同名函数。所有同名函数的形参列 表不能完全相同,即要么形参数量不同,要么形参的数据类型不完全相同(形参名字不同不管用)。
如下 fun 函数 4 个重载版本的声明是允许的。
(理解!!!!!!!!!!!!!!)
int fun(int a, int b);
int fun(int a, int b, int c);
double fun(double a);
double fun(double a, double b);
2、案例:输出几个数中的最大值。
#include<iostream>
using namespace std;
int max(int x, int y)
{
if (x > y) return x;
else return y;
}
double max(double x, double y)
{
if (x > y) return x;
else return y;
}
int max(int x, int y, int z)
{
if (x >= y && x >= z) return x;
else if (z >= y && z >= x) return z;
else return y;
}
int main()
{
int x = 5, y = 6, z = 7, t2, t3;
double u = 5.5, v = 6.6, w;
t2 = max(x, y);
cout << "t2 = " << t2 << endl;
t3 = max(x, y, z);
cout << "t3 = " << t3 << endl;
w = max(u, v);
cout << "w = " << w << endl;
return 0;
}
运行结果如下——
说明:如果形参数量相同,只是类型不同,函数的功能也相同,那么用上一节的 函数模板是更推荐的写法。
回顾一下函数模版——
#include<iostream>
using namespace std;
template<typename T1, typename T2>
int compare(T1 a, T2 b)
{
if (a == b) return 0;
else if (a < b) return -1;
else return 1;
}
int main()
{
cout << compare(1, 0) << endl;
cout << compare(1.5, 2.1) << endl;
return 0;
}
二、递归函数
1、递归函数的定义 C++语言允许函数调用该函数自身,这样的嵌套调用称为函数的递归调用。 main 函数不允许被别人调用,包括被 main 函数自身调用,因此递归函数必然是 main 函数外的其他函数。 对于返回值为 void 类型的递归函数,通常长这样:(其中…表示某些参数或者某 些语句)
对于返回值为 int(double、char 等类似)类型的递归函数,通常长这样:
2、递归函数可能存在的问题
无限递归,没有退出函数的出口。例如:
显示结果:
从前有一座山…
从前有一座山…
从前有一座山…
从前有一座山…(没完没了)
原因:第一次调用 f 函数时,
调用了第二次 f;
第二次调用 f 函数时,
调用了第三次f;
……
修改:
void f(int t)
{
cout << "从前有一座山…";
t++;
if (t < 100)
{
f(t);
}
}
这样,当主函数调用 f(0)时,
输出 100 遍 "从前有一座山…"后,
f 函数就会因为不 满足 t<100而不再继续递归调用自身。
3、递归函数的两个要素
(1)递推公式
(2)退出条件
4、案例 (1)斐波那契数列 用递归函数求斐波那契数列的第 n 项。斐波那契数列第 1 项和第 2 项都是 1,后 面每一项都是前两项之和,即 1, 1, 2, 3, 5, 8, 13, …
先用数学的方法描述斐波那契数列的第n项,用f(n)来表示第n项的值,即f(1)=1, f(2)=1,f(3)=2,f(4)=3,…。那么可以用以下通项公式来表示 f(n)的值:
再把上面的数学通项公式转换成计算机的递归函数,把其中 f(n)的值写成函数 f 的返回值。
#include <iostream>
using namespace std;
int f(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return f(n - 1) + f(n - 2);
}
}
int main()
{
int n;
cin >> n;
cout << f(n);
return 0;
}
#include <iostream>
using namespace std;
int f(int n)
{
if (n == 1 || n == 2)
{
return 1;
}
else
{
return f(n - 1) + f(n - 2);
}
}
int main()
{
int n;
cin >> n;
cout << f(n);
return 0;
}
(2)杨辉三角求路径数量 桌面上有一些小方格,一直蚂蚁从 A 格爬到 B 格,这只蚂蚁只会向右爬或者向 下爬,问有多少种不同的爬法?
分析:这实际上是杨辉三角问题(以下是人的解法)
对于编程而言,先为每个小方格编个行号和列号
因而 A 格是第 1 行第 1 列,
B 格是第 6 行第 6 列
数学上,
我们用 f(x,y)表示从 A 格到第 x 行第 y 列那一格有多少种不同的爬法, 那么本题需要求的是 f(6,6)的值。
可以观察到,第 1 行和第 1 列的 f 值都是 1,即 f(1,y)=1,f(x,1)=1;其余格子上,f 值等于左侧的 f 值加上侧的 f 值,
即 f(x,y)=f(x-1,y)+f(x,y-1)。
#include <iostream>
using namespace std;
int f(int x, int y)
{
if (x == 1 || y == 1)
{
return 1;
}
else
{
return f(x - 1, y) + f(x, y - 1);
}
}
int main()
{
cout << f(6, 6);
return 0;
}
三、静态变量
当函数中变量定义前加上 static 关键字时,该变量是静态变量。静态变量定 义时如果有初始化值,该初始化工作只会执行第一次。静态变量能够一直保存存储的值,直到程序结束。
#include<iostream>
using namespace std;
int f()
{
int x = 1;
static int y = 1;
x = x + 2;
y = y + 2;
return x + y;
}
int main()
{
cout << f() << endl;
cout << f() << endl;
return 0;
}