简介
===================================================================================================
一、递归
1、递归
直接或间接调用自己的函数称为递归函数。
一个简单的递归函数例子就是阶乘的计算。
递归函数必须定义一个终止条件,否则函数就会“永远递归下去”,意味着函数会一直调用自身直到程序栈耗尽。下面val为1是终止条件。
主函数main不能调用自身
//求数n到1的乘积
int factorial(int val){
if(val>1)
return factorial(val-1)*val;
return 1;
}
//求最大公约数
int rgcd(int v1,int v2){
if(v2!=0)
return rgcd(v2,v1%v2);
return v1;
}
二、函数声明
1、函数的声明
正如变量必须先声明后使用一样,函数在使用之前必须先声明。
与变量的定义类似,函数的声明也可以和定义分离;
一个函数只能定义一次,但可以多次声明。
函数声明由函数返回类型、函数名、形参列表组成。形参列表必须包括形参类型,但是不必对形参命名。
函数返回类型、函数名、形参列表称为函数原型,函数原型描述了函数的接口。
函数原型为定义函数的程序员和使用函数的程序员之间提供了接口,在使用函数时,程序员只对函数原型编程即可。
变量可在头文件中声明,在源文件中定义,函数也可以。
把函数声明直接放到头文件中,这样可以确保对于指定函数其所有声明保持一致。如果函数接口发送变化,则只要修改其唯一的声明即可。
2、默认实参
调用函数时,可以省略有默认值的实参,编译器会 为我们省略的实参提供默认值。
默认实参是通过给形参表中的形参提供明确的初始值来指定的,程序员可为一个或多个形参定义默认值,但是,如果有一个形参具有默认实参,那么,它后面所有的形参都必须有默认实参,也就是说,具有默认实参的形参应该出现在形参表的末尾。
可以把一个char值传递给int型形参,反之亦然。
int fun(int a,int b=9,int c=10);//可以!!!
string screenInit(string::size_type height=24,
string::size_type width=80,
char background=' ');
- 调用包含默认实参的函数时,可以为该形参提供实参,也可以不提供。如果提供了实参,则它将覆盖默认的实参值,否则,函数使用默认实参值。
//下面的调用都是正确的,如果没有提供实参,将使用默认的实参,如果提供了那么将会覆盖默认的实参
string screen;
screen=screenInit();
screen=screenInit(66);
screen=screenInit(66,256);
screen=screenInit(66,256,'#');
3、默认实参的初始化
默认实参可以是任何适当类型的表达式:
string::size_type screenHeight();
string::size_type screenWidth(string::size_type);
char screenDefault(char = ' ');
string screenInit(
string::size_type height =screenHeight(),
string::size_type width =screenWidth(screenHeight()),
char background = screenDefault())
//默认实参是一个表达式,而且默认值用作实参,则在调用函数时求解该表达式。
}