函数

函数知识点分析

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
posted @ 2019-09-13 15:02  喃猫  阅读(220)  评论(0编辑  收藏  举报