天天看点

C++两个函数可以相互递归吗_C++入门:函数

什么是函数?

一般呢,在一个变化过程中,如果有两个变量x和y,并且对于x的每一个确定的值,y都有唯一确定的值与其对应,我们就把x称为自变量,把y称为因变量,y是x的函数。

C++两个函数可以相互递归吗_C++入门:函数

说函数,不得不说 function,英文中 function,有完成一定功能,起作用的意思。所以在程序设计中,function 一词更应该理解成这段代码完成某种功能。

数学是理论科学,计算机程序是应用科学,计算机程序里面的函数概念继承自数学,在数学上,输入、数据处理、输出,这三者缺少任何一个都是没有意义的,而在计算机程序里可以设计成什么都不做。

01 对于一个 C 程序而言,它所有的命令都包含在函数内。每个函数都会执行特定的任务,每个函数都只能被定义一次,但一个函数可以根据需要被多次的声明和调用。 在之前的教程中,我们会看到所有的代码都要写在int main() 的花括号里。这个main就是一个函数,是程序启动后第一个被执行的函数。当我们执行一个编译好的C++程序时,程序会直接找到main函数,顺序执行里面的每一条语句。如果缺失了main函数,编译时就会报错。 其他所有函数都是 main()函数的子函数(或者与之相关联的过程,例如回调函数),并且它们的函数名称可以自己设定。 现在我们通过一个小例子看一下,输入两个整数,输出它们的和。

#includeusing namespace std;int main(){  int a,b,c;  cin>>a>>b;  c=a+b;  cout<  return 0;  }
           

上面是我们开始接触的最基本的写法,那么利用函数的话可以这样写:

#includeusing namespace std;int sum(int a,int b){  return a+b;}int main(){  int a,b,c;  cin>>a>>b;  c=sum(a,b);  cout<  return 0;    }
           

我们看到在main()下,cout输出的c的结果变成了sum(a,b),而不是前面的a+b。这里就是对自定义函数sum的调用,我们从sum函数获取结果。

C++中,函数可以看作一种独立的模块,是将重复出现的一些程序整理成独立的模块。在需要使用的时候只需要调用这些模块,而不需要将这些程序再重新写一遍。这样就减少了代码数量,并且让程序的维护更加轻松。

简单说,函数(function)就是一段程序语句的集合,并且给一个名字来代表此程序代码的集合。

02

C++中自定义函数分为声明和定义两部分。

声明是指:事先告诉编译器这个函数是存在的,并说明相关的信息(函数类型、参数数量、参数类型)。

定义是指:对函数功能的代码描述。

因为C++中程序开始执行是从main()函数开始的,所以我们在main()函数中调用其他函数分两种情况:

1、调用的函数在main()函数之前定义

2、调用的函数在main()函数之后定义

第一种在调用之前定义的函数不需要声明,第二种在调用之后才定义的函数则需要进行声明,否则会出现编译错误。但是由于在编写程序的过程中,我们有时候很难时刻关注函数的位置,因此我们一般习惯上都要对每个自定义函数先进行声明,然后才去定义调用。

如下面这样,不做声明,是无法编译的。

#includeusing namespace std;int main(){  int a,b,c;  cin>>a>>b;  c=sum(a,b);  cout<  return 0;    } int sum(int a,int b){  return a+b;}
           

自定义函数的声明语法格式如下:

返回值类型 函数名(数据类型 参数1,数据类型2 参数2,……);

返回值类型 函数名(数据类型,数据类型2,……);

声明部分可以省略大括号,直接以“;”结尾。其中参数名可写可不写。例如:

int sum(int n1,int n2);int sum(int , int);
           

一个完整的函数分为这么几部分:

函数返回类型,函数名,参数,函数体,返回值。如下面函数,其中int是函数返回值类型,sum是函数名,c是返回值,int a,b是参数,花括号为函数体。

int sum(int a,int b){  int c=a+b;  return c;}
           

这里特别注意一下void类型的函数可以省略return语句,其余类型则必须至少含有一个return语句为调用处提供返回值,下面有个小例子。

接下来就是函数的调用,函数的调用就是如何使用函数。在调用函数的时候,需要按照函数定义好的参数数量以及参数类型去传递对应的参数。

语法格式如下:  

函数名(参数1,参数2,……); 

若函数是无参函数,不需要传递参数或者在小括号写上void  函数名();或函数名(void);  若有返回值,就可以使用赋值运算符“=”将返回值赋给变量。

变量 = 函数名(参数1,参数2,……);

所以上面的代码如果把函数放在main()函数之后的话可以这样写:

#includeusing namespace std;int sum(int a,int b); //函数sum的声明int main(){  int a,b,c;  cin>>a>>b;  c=sum(a,b);//函数sum的调用  cout<  return 0;    } int sum(int a,int b)//函数sum的定义 {  return a+b;}
           

在函数中也可以直接输出,如上面的代码可以修改为:

#includeusing namespace std;void sum(int a,int b); //函数sum的声明int main(){  int a,b;  cin>>a>>b;  sum(a,b);//函数sum的调用  return 0;    } void sum(int a,int b)//函数sum的定义 {  cout<< a+b;}
           

这里简单提一下函数的嵌套调用和递归调用,嵌套调用指的是函数里面调用另一个函数,刚才我们在main函数调用max函数就是一个嵌套调用行为。仔细阅读下面例子,思考为什么函数a()要放到函数b()后面,如何避免?

#includeusing namespace std;int b(){  return 2020;}int a(){  return b();}int main(){  cout<  return 0;    }
           

递归调用则是指的函数自身调用自身的情况,比如我们需要计算n的阶乘,我们可以循环也可以利用函数递归调用。当然递归一定不要忘记设置递归终止,否则就可能出现死循环了。

#includeusing namespace std;int fact(int n);int main(){  int a;  cin>>a;  cout<  return 0;    } int fact(int n){  if(n==0 || n==1) return 1;  //设定递归终止  else return n*fact(n-1);  //递归调用}
           

03

最后说一下内置函数,在 C++ 中,除了可以创建各种函数,还包含了各种有用的函数供您使用,这些函数写在标准 C 和 C++ 库中,叫做内置函数。

如数学函数,头文件cmath或math.h中包含的常用数学函数。math.h是C语言的头文件,因为C++兼容C所以在C++中用math.h也是可以的。不过推荐的是使用#include ,总归你学C++不是,其中的函数和使用方法几乎完全相同。

C++两个函数可以相互递归吗_C++入门:函数

在NOI竞赛中,C++程序禁止使用内嵌汇编和以下划线开头的库函数或宏(自己定义的除外),可以使用STL中的模板。所以小伙伴在学习时可以多少了解一下,比如STL提供了两个用来计算排列组合关系的算法,分别是next_permutation和prev_permutation,挺香的~     「您的每一个 在看 对我们都是鼓励」

C++两个函数可以相互递归吗_C++入门:函数

继续阅读