C++函数与递归
函数就是一个完成某项特定的任务的一小段代码,这段代码是有特殊的写法和调用方法的
函数使用的好处:代码可以复用,只要根据需要定义出一个函数,需要这个功能的地方,直接调用函数就行,降低了代码的冗余,提升开发效率
函数分类:分为库函数和自定义函数
库函数是标准库中提供的,直接用即可
ret_type fun_name(形式参数)
{ }
ret_type 表示函数计算结果的类型,当什么都不需要返回的时候就写void
fun_name 为了方便使用,就像人的名字一样,所以取的时候尽量有意义
函数的参数也可以是void,明确表示函数没有参数,如果有参数,多个参数用逗号隔开,每个参数要分别交代清楚参数的类型和名字
{} 括号括起来的部分称为函数体,函数体就是完成计算的过程
举例:加法
int Add(int x,int y) 函数的定义 ,其中x y表示形式参数
{
int z = 0;
z = x + y;
return z;
}
int main()
{
int a = 0;
int b = 0;
cin >> a >> b;
int r = Add(a,b); 函数的调用
cout << r << endl;
return 0;
}
函数的参数分为实参和形参
实参:真实传递给函数的参数
形参:在函数的定义中,函数名后面的括号中的参数。形参不会向内存中申请空间,不会真实存在,只有在函数被调用的过程中为了存放实参传递过来的值,才向内存中申请空间,对于数组来说不适用,在数组中形参与实参所用空间相同
函数的实参和形参的名字可以相同也可以不同
函数的实参和形参的个数要相同
数组传参,形参是不会创建新的数组的
如果是字符串做函数参数的情况下,直接在形参的部分使用字符串来接受就可以,这里的形参s也是实参s的一份临时拷贝,对形参的修改不能影响实参
void test(string s1)
{
cout << s1 << endl;
}
int main()
{
string s = "hello world";
test(s);
cout << s << endl;
return 0;
}
全局变量不用传参
int arr[10] = {1,2,3,4,5,6,7,8,9,10};
void print_arr()
{
for(int i = 0; i < 10; i++)
{
cout << arr[i] << " ";
}
cout << endl;
}
int main()
{
print_arr();
return 0;
}
返回值 return
情况一:后边可以什么都不写,这种写法适合函数返回类型是void的情况。情况2:如果后边有值的话,可以是一个数值,也可以是一个表达式,如果有表达式,则表达式先执行,再返回表达式的结果,函数的返回值可以用变量来接收,如果不需要这个返回值,也可以不接收。情况3:return返回的值和函数返回类型不一致,系统会自动将返回的值的类型隐式转换为函数的返回类型。情况4:return语句执行后,函数就彻底返回,后边的代码就不再执行。
函数声明
int Add(int x, int y); 函数声明
int main()
{
int a = 10;
int b = 20;
int c = Add(a,b); 函数调用
cout << c << endl;
return 0;
}
int Add(int x,int y) 函数定义
{
return x + y;
}
函数使用要注意:函数要满足先声明后使用,函数的定义其实是一种特殊的声明
函数的声明只要写在函数的调用之前就可以,位置是可以在主函数的内部的
函数声明中,形参的变量名是可以省略的,可以只保留类型
传值调用:实参在传递给形参的时候,形参会单独创建空间,对形参的修改不会影响实参
实参 ---- 》 形参 是单向传递的
引用:引用不是新定义的一个变量,而是给已存在的变量取一个别名,编译器不会为引用变量开辟内存空间,它和它引用的变量是同一块内存空间。
引用的语法格式:类型&引用变量名 = 引用实体;int a = 10;
int& ra = a;
引用在定义时必须初始化,一个变量可以有多个引用,引用一旦引用一个实体,再不能引用其他实体
swap 函数 可以用来交换两个变量,也可以用来交换两个数组,需要头文件 #include
int arr1[4] = {0};
int arr2[4] = {10,20,30,40};
swap(arr1,arr2);
传引用的效率要高于传值
数组再传参的时候,形参和实参本来就是同一个数组,所以数组传参的时候,不需要使用引用参数
函数重载:在同一个作用域中可以有多个同名函数,它们的函数名称相同,但是参数列表不同
函数重载语法形式: 函数返回类型 函数名(参数1,参数2);
库函数max和min ,需要头文件为 #include
int m = max(a,b); int 出写要返回的类型,a表示要比较的第一个数,b表示要比较的第二个数
string s1 = "abcdef";
string s2 = "bbq";
string m = max(s1,s2); 默认按照字典序进行比较
假如我不要按照字典数进行比较,想要按照字符串的长度进行比较:comp 自定义比较函数对象或比较函数,用于确定“较大”值的标准,比较函数应当返回一个 布尔值 ,表示第一个参数是否“小于”第二个参数
bool cmp_str(string s1,string s2) s1 s2表示形参最好不要与实参写一样,bool为此处固定的返回类型,cmp_str 的函数名自定义自己取
{
return s1.size() < s2.size(); 这里要给一个判断小于的标准
}
int main()
{
string s1 = "abcdef";
string s2 = "bbq";
string m = max(s1,s2,cmp_str); 此处要传参写 cmp_str
cout << m << endl;
return 0;
}
bool cmp_str(string s1,string s12)
{
return s1.size() < s2.size(); 在min中依旧是给一个判断小于的标准
}
int main()
{
string s1 = "abcdef";
string s2 = "ddq";
string m = min(s1,s2,cmp_str);
cout << m << endl;
return 0;
}
递归:具体是指函数在定义的时候直接或间接调用自身的方式(大白话就是 函数自己调用自己)
int main()
{
cout << "hehe" << endl;
mian(); 函数main调用自己
return 0;
} 这个函数会陷入死循环,最终导致程序崩掉
递归就是把大事化小的过程,递归中的递就是递推的意思,归就是回归的意思
递归的必要条件:递归存在限制条件,当不满足这个限制条件的时候,就停止。每次递归之后就会越来越接近这个限制条件,递归是依赖函数来实现的











