函数
本章探讨
1.为什么要用函数
2.为什么要用函数重载
3.什么是值传递
4.什么是地址传递
5.如何编写递归函数
为什么要用函数
1.函数可以让我们的主程序更加简便。
2.函数可以反复调用,减少了程序的整体复杂性。
例如我们计算a的n次方:
#include<iostream>
using namespace std;
int power(int x,int y)
{
int i;
int s=1;
for(int i=y;i>=1;i--)
{
s*=x;
}
return s;
}
int main()
{
int x,n;
cin>>x>>n;
cout<<power(x,n)<<endl;
return 0;
}
为什么要用函数重载
若没有函数重载,我们在运用同种功能的函数而定义不同的名字,这给我们造成了极大的不便。
例如:
#include<iostream>
using namespace std;
int sum(int a.int b)
{
return a+b;
}
double sum(double a,double b)
{
return a+b;
}
int main()
{
int a,b,c,d;
cin>>a>>b;
cout<<sum(a,b)<<endl;
cin>>c>>d;
cout<<sum(c,d)<<endl;
return 0;
}
什么是值传递
这种情况下,在调用函数时,将实际参数复制一份传到函数中,在函数中对参数值进行修改时不会改变实际参数。
例如:
#include<iostream>
using namespace std;
void fun(int a,int b)
{
int t=a;
a=b;
b=t;
}
int main()
{
int a,b;
cin>>a>>b;
fun(a,b);
cout<<a<<" "<<b<<endl;
return 0;
}
什么是地址传递
当调用一个过程时,是把实参变量的内存地址传递给被调用过程的形参,也就是说形参与实参使用相同地址的内存单元。因此当在被调用过程中改变形参的值,就等于改变了实参的值。
例如:
#include <iostream>
using namespace std;
void swap(int *x,int *y);
int main(){
int x,y;
x=1;y=2;
cout << " x=" << x << " y=" << y << "\n";
swap(&x,&y);
cout << "after swap: x=" << x << " y=" << y <<endl;
return 0;
}
void swap(int *x,int *y){
int t=*x;
*x=*y;
*y=t;
}
递归函数
递归就是一个函数在它的函数体内调用它自身。执行递归函数将反复调用其自身,每调用一次就进入新的一层。递归函数必须有结束条件。当函数在一直递推,直到遇到墙后返回,这个墙就是结束条件。 所以递归要有两个要素,结束条件与递推关系
注:
递归的时候,每次调用一个函数,计算机都会为这个函数分配新的空间,这就是说,当被调函数返回的时候,调用函数中的变量依然会保持原先的值,否则也不可能实现反向输出。
例如:
#include<iostream>
using namespace std;
int fun(int n)
{
if(n==0||n==1)
return 1;
else
return n*fun(n-1);
}
int main()
{
int n;
cin>>n;
cout<<n<<"的阶乘为"<<fun(n)<<endl;
return 0;
}
注意:在实际使用中,递归函数由于消耗时间比较长(相比for循环和while循环),所以很少使用。