函数
函数知识点分析
1.为什么要用函数
使用函数有利于代码的重用,提高开发效率,增强程序的可靠性,便于分工合作和修改维护。
/*
* 编写一个求x的n次方的函数
*/
#include "pch.h"
#include <iostream>
using namespace std;
//计算x的n次方
double power(double x, double n)
{
double val = 1.0;
while (n--)
{
val *= x;
}
return val;
}
int main()
{
cout << power(5, 2) << endl;
return 0;
}
25
2.为什么要用函数重载
C++允许功能相近的函数在相同的作用域内以相同函数名定义,从而形成重载。方便使用,便于记忆。
//参数类型不同
int add(int x,int y);
float add(float x,float y);
//参数个数不同
int add(int x,int y);
int add(int x,int y,int z);
注意:
int add(int x,int y); int add(int a,int b); //错误,编译器不以形参名来区分函数
int add(int x,int y); void add(int a,int b); //错误,编译器不以返回值来区分函数
切记:不要将不同功能的函数定义为重载函数,以免出现对调用结果的误解,混淆。
int add(int x,int y) {return x+y};
float add(float x,float y) {return x-y};
记:当使用具有默认形参值的函数重载形式时,需要注意防止二义性。
//在编译时无法区分为不同的重载形式,即编译器无法确定应该执行哪个重载函数
void fun(int length,int width=2,int height=33);
void fun(int length);
3.什么是值传递
值传递是指在调用函数时将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,将不会影响到实际参数。
#include"pch.h"
#include<iostream>
using namespace std;
void fun(int a)
{
a = 1; //修改参数
}
int main()
{
int a = 2;
fun(a); //调用fun函数
cout << a << endl; //输出变量,变量的值没改变
return 0;
}
2
4.什么是地址传递
就是当调用函数时,是把实参变量的内存地址传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。因此当在被调用的过程中改变形参的值,就等于改变了实参的值。
#include"pch.h"
#include<iostream>
using namespace std;
void fun(int* x);
int main()
{
int a = 1;
cout << a << endl;
fun(&a);//传入地址
cout << a << endl;
return 0;
}
void fun(int* x)
{
*x = *x + 5;
}
1
6
5.如何编写递归函数
函数自己调用自己就成为递归。
//用递归的方法编写函数求Fibonacci级数,公式为fn=f(n-1)+f(n-2),(n>2),f1=f2=1。
#include "pch.h"
#include <iostream>
using namespace std;
int fibonacci(int n);
int main() {
int n;
cout << "请输入一个整数(大于2)" << endl;
cin >> n;
cout << "求出的Fibonacci级数为" << fibonacci(n) << endl;
return 0;
}
int fibonacci(int n)
{
if (n == 1 || n == 2)//终止条件
return 1;
else
return fibonacci(n - 1) + fibonacci(n - 2);
}
请输入一个整数(大于2)
5
求出的Fibonacci级数为5
请输入一个整数(大于2)
6
求出的Fibonacci级数为8
//Hanoi柱子的转换(sre,medium,dest)原始,中间介质,目标
//不是A,B,C的转换,A,B,C只是名字,原始和目标的转换是在变的。
//经典递归hanoi
#include "pch.h"
#include <iostream>
using namespace std;
void move(char sre, char dest)
{
cout << sre << "-->" << dest << endl;
}
void hanoi(int n, char sre, char medium, char dest)//原始,中间介质,目标
{
if (n == 1)
move(sre, dest);
else
{
hanoi(n - 1, sre, dest, medium);
move(sre, dest);
hanoi(n - 1, medium, sre, dest);
}
}
int main()
{
int m;
cout << "输入个数";
cin >> m;
hanoi(m, 'A', 'B', 'C');
return 0;
}
//可以参考 https://blog.csdn.net/zhaojw_420/article/details/62579366
输入个数3
A-->C
A-->B
C-->B
A-->C
B-->A
B-->C
A-->C