CSP语法题基础(三)
CSP算法题基础(3)
函数
函数简单介绍
#include<iostream>
using namespace std;
//函数声明
int foo2(int s);//先声明,可以以后再定义。声明的时候变量名s可以不写
//函数定义
int foo(int n){ //int 是返回类型 foo是函数名 int n是形参,通常有0个到多个
static int cnt =0; //等价于在函数内部开了一个只有在这个函数内部才能访问的变量,和全局变量一样,不给静态变量赋初值,它一定是0 静态变量和全局变量一样,会开在堆里面
// 静态变量和全局变量都是定义在堆中,简单来说所有定义在函数里面的变量都是定义在栈中,所有定义在函数外面的都是定义在堆中,堆空间比较大。 但是同样都是定义在堆中的数据,在未被使用时都是处于.bss段中 ,未来在使用的时候才会动态分配空间并且初始化成0 // 在函数内部开一个普通数组,如果开的特别大,就会爆栈(栈空间默认1MB);但要是开一个静态数组,它就会开到堆里,堆空间要比栈空间大的多
cnt++;
int res =1;
for(int i=1;i<n;i++){
res = res * i;
}
return res; // 不写return 会返回随机值 函数调用是一个入栈过程,每一个函数会占据栈空间里的特定部分,如下图,返回值变量一般会处于两个函数交界部分,要是不写return的值,就不会修改返回值变量的值,所以就会造成没return报随机数
}
// 全局变量定义在整个程序中
// 局部变量,定义在函数,包括main函数里的变量
// 静态变量,定义在函数里,但是无论调用多少次,都只会创建1次的变量,通常用stastic修饰;功能上有点像定义在局部变量的全局变量
// 位置上看似局部变量,功能上看似全局变量
int main(){
int ans = foo(5);
cout << ans << endl;
}
参数传递
-
非引用传递:函数内部对传入的变量进行改变,函数外部变量值并未发生改变
-
引用传递:函数内部对传入变量进行代表,会影响到函数外部传入前的值
void swap(int &x,int &y){ //采用引用传递才可以正真实现交换的值
int t;
t = x;
x = y;
y = t;
}
函数重载:如果定义多个函数重名,C++会认为没有影响,只要函数名,形参都不相同即可
- 数组参数:可以将一个数组作为参数传递给函数
void output(int m,int a[5]){
for(int i=0;i<m;i++){
cout << a[i] << " ";
}
}
int main(){
int a[5] = {1,2,3,4,5};
output(5,a);
return 0;
}
递归过程部分中间值被算了好多遍,相比与循环效率低;但是递归比较好设计,不用思考循环执行多少遍。比如斐波那契数列,用循环算算到1000多项时间也不长,但是用递归算算到42项左右用时都到1000+ms了
算法#include
几种排序算法的复杂度是:
- 比较慢的:选择排序,插入排序,冒泡排序 时间复杂度是O(n*n)
- 比较快的:快速排序,归并排序 O(nlogn) 快速排序最坏情况下是O(n*n),归并排序时间复杂度均摊都是O(nlogn)