对于函数问题探讨
Posted wzfs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对于函数问题探讨相关的知识,希望对你有一定的参考价值。
函数
一、为什么要用函数
函数是模块划分的基本单位,是对处理问题过程的一种抽象。一个较为复杂的系统往往需要划分为若干个子系统,然后对子系统分别进行开发和调试,而函数就实现了这一模块化功能。函数编写好后可进行重复使用,提高了开发效率、增强程序的可靠性也利于分工合作和修改维护。
运用函数求解x的n次方
二、函数重载
1、什么是函数重载?
两个以上的函数,具有相同的函数名,但是形参的个数或者类型不同,编译器根据实参和形参的类型及个数的最佳匹配,自动确定调用哪一个函数。
2、重载函数的好处
重载函数通常用来命名一组功能相似的函数,这样做减少了函数名的数量,对程序的可读性有很大的好处。当一个程序员需要写大段代码时,若遇到相似的函数,重载函数将会为他们节省很大的时间和精力。
3、特别注意
函数重载必须形参不同(个数不同或类型不同)
列如
```
(1)int add(int x,int y)
int add(float x,float y) 形参类型不同
(2)int add(int x,int y,int z)
int add(int x,int y) 参数个数不同
```
错误式列
int add(int x,int y);int add(int a,int b) |
编译器不能通过形参名来区分函数,编译错误!
int add(int x,int y);void add(int x,int y) |
编译器不能通过返回值类型来区分函数,编译错误!
int add(int x,int y)return x+y;int add(int x,int y)return x-y; |
返回不同,函数功能不一样,编译器无法判断调用哪一个。
三、函数的参数传递
在函数未被调用时,函数的形参并不占有实际内存空间,也没有实际的值,传递形式有两种:值传递和引用传递。
1、值传递
当发生函数调用时,给形参分配内存空间,并用实参来初始化形参(直接将实参的值传递给形参),是单向传递,即就是形参获得了实参的值便将与实参脱离关系,以后形参无论怎样变,实参都不会变。
列如下面的两个数互相交换的列子
输入两个整数交换的代码:
```
int swap(int a,int b)
{
int t=a;
a=b;
b=t;
}
```
运行之后会看到结果如下
程序在调用子函数时会为a,b重新开辟新的空间,并将实参的值赋给a,b;在swap函数中a,b的值确实交换了,但这并不与主函数中的两个实参存在关系 |
这就是因为值传递是单向传递,形参改变对实参是不起作用。若需要改变形参的同时改变实参,就需要用引用传递。
2、引用传递(地址传递)
我们知道,变量时可以保存数据的内存位置名称。当使用变量时,就是在访问它存储内存位置里的数据。引用变量是变量的另一个别名,它不占独立空间,没有自己的存储位置,当改变引用变量的值时,相应的变量的值也会随之更改。如下代码:
```
int a,b;
int &r=a; 建立一个引用r,并初始化为一个变量a的别名;
b=2;
r=b; 相当于将b的值赋给a即a=b
```
如上列两个数的交换改写
```
int swap(int &a,int &b)
{
int t=a;
a=b;
b=t;
}
```
将a,b改成一个别名,不占独立空间,就会使两数成功交换。运行结果如下:
还需注意
·声明一个引用使必须对其进行初始化,使它指向一个已存在的对象。如上图的int &r=a;
·一旦一个引用被初始化后,就不能指向其他对象。
四、递归函数
**如果函数可以直接或间接的调用自身,就称为递归调用。比如int fun1(){fun1();}
运用递归函数,需要用到逆向思维
比如计算阶乘算法,计算5的阶乘,逆向思考
5=5x4!--->4!=4x3! --->3!=3x2! --->2!=2x1! ---> 1!=1x1
代码如下
汉诺塔问题
有三个指针,A针上有n个圆盘且盘子大的在下,小的在上。要求把n个盘子从A针移到C针上,可借助B针,每次只能移动一个盘子,并且在移动过程中要求大的在下,小的在上。
此问题也可以用递归的思想做:(A针-->起始src;B针-->中介medium;C针-->目标dest)
因为每次只能移动一个盘子,要想把n个盘子从A盘移到C盘,就必须将A盘上的n-1个盘子先移到B盘上,才能把最下层的大盘子移到C盘上。执行完这一过程后B针上就有n-1个盘子,A针上没有,重复刚才的思想,再将B针上的n-2个盘子借助C针移到A针,这样最下面的盘子就移到C盘上……直至最后一个盘子移到C针上。 |
编写函数把n个盘子从src针移到dest针,以medium作为中介
void hanoi(int n,char src,char medium,char dest) |
把最上面的指针移动到dest针
void move(char src,char dest) |
1、先把n-1个指针从src借助dest移到medium
void hanoi(n-1,src,dest,medium) |
2、再将最下层的盘子移到dest上
3、将n-1个盘子借助src从medium移到dest上
void hanoi(n-1,medium,src,dest) |
运行代码:
以上是关于对于函数问题探讨的主要内容,如果未能解决你的问题,请参考以下文章
前端面试题之手写promise
VSCode自定义代码片段——声明函数
VSCode自定义代码片段8——声明函数
在 Visual Studio 中创建构造函数的代码片段或快捷方式
调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段
使用从循环内的代码片段中提取的函数避免代码冗余/计算开销