对于函数问题探讨

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上
void move(src,dest)

3、将n-1个盘子借助src从medium移到dest上
void hanoi(n-1,medium,src,dest)

运行代码:

技术图片
技术图片

以上是关于对于函数问题探讨的主要内容,如果未能解决你的问题,请参考以下文章

前端面试题之手写promise

VSCode自定义代码片段——声明函数

VSCode自定义代码片段8——声明函数

在 Visual Studio 中创建构造函数的代码片段或快捷方式

调用模板化成员函数:帮助我理解另一个 *** 帖子中的代码片段

使用从循环内的代码片段中提取的函数避免代码冗余/计算开销