23-24C++(40)——函数重载、递归函数、静态变量

一、函数重载

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;
}

运行结果

6

8

说明:第一次运行 f 函数时,x 和 y 的值都是 1,然后都被加成了 3,返回的结果 是 6。第二次运行 f 函数时,x 还是初始化成了 1,由于 y 是静态变量,保留了上 一次的值 3,而不会再次初始化为 1,所以最终 x 依旧被加成了 3,y 被加成了 5,返回的结果是 8。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

拔刀能留住落樱吗、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值