C语言学习篇-6函数、递归、嵌套
2016-06-01 21:17
246 查看
说明:本文主要内容为C语言函数定义及使用,形参与实参的介绍,递归函数、嵌套函数的使用。
目的:将一些常用的功能封装起来,以备调用,方便代码重用,便于维护。
步骤:确定函数名,确定函数体,调用。
格式:返回值类型 函数名 (形式参数列表){ 函数体 }
定义函数:
取一个有意义的函数名
确定形参列表
编写函数体
返回值
示例:两个数中较大的数
1. 形式参数:定义函数时,函数后面括号内的参数。
2. 实际参数:调用函数时,传入的具体数据。
3. 注意:
形参和实参的个数必须相等。
函数体内部不能定义和形参同名的变量。
如果是基本的数据类型作为形参,则是纯粹的值传递,修改函数内部形参的值并不会影响到实参的值。
一个函数可以没有形参,也可以有无限个形参。
数据由实参传递给形参,具有单向传递性,不可逆。
1. 作用:从被调函数返回到主调函数继续执行,返回时可以附带一个返回值,返回值由return后面的参数指定。如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码)。
2. 返回值使用注意:
①. C语言是弱语法弱类型的语言,非常不严格。
②. 如果没有写清楚返回值的类型,则默认为int型的。
③. Void代表没有返回值。
④. C语言默认情况下,不允许有两个同名的函数。
函数之间是平等的,不能够嵌套定义。(可以嵌套调用,不可以嵌套定义)
函数不可以重复定义,但是可以重复声明,只要是在调用前声明就可以,地方随便。
函数如果是只有声明没有定义,那么编译可以成功,但链接时会失败。
函数如果在调用时,函数定义在调用之后,且前面没有进行相应的声明,则编译器报错。
无参、有返回值
有参、有返回值
有参、无返回值
递归条件:
可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。
可以应用这个转化过程使问题得到解决。
必定要有一个明确的结束递归的条件,否则程序会崩溃。
直接递归:
示例:斐波那契数列
间接递归:
![](http://hiphotos.baidu.com/exp/pic/item/d041a4a1cd11728b48642dd7cdfcc3cec2fd2cbe.jpg)
图中表示了两层嵌套的情形。其执行过程是:执行main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b 函数时,又转去执行b函数,b函数执行完毕返回a函数的断点继续执行,a函数执行完毕返回main函数的断点继续执行。
示例:计算5!+ 10!
2.数据由实参传递给形参,具有单向传递性,不可逆。
3.一个函数在它的函数体内调用它自身称为递归调用。
4.函数不可嵌套定义,但是可以嵌套调用。
函数
函数
定义:一系列C语句的集合。 每个函数负责完成一部分的功能,函数将功能封装起来,以供程序调用。目的:将一些常用的功能封装起来,以备调用,方便代码重用,便于维护。
步骤:确定函数名,确定函数体,调用。
格式:返回值类型 函数名 (形式参数列表){ 函数体 }
定义函数:
取一个有意义的函数名
确定形参列表
编写函数体
返回值
示例:两个数中较大的数
#include <stdio.h> // 求两个数中较大数的函数 int returnMax(int a, int b){ return a > b ? a : b; } int main() { printf("Two Numbers in the larger number is %d",returnMax(10,45)); return 0; }
参数
参数分为形式参数和实际参数。1. 形式参数:定义函数时,函数后面括号内的参数。
2. 实际参数:调用函数时,传入的具体数据。
3. 注意:
形参和实参的个数必须相等。
函数体内部不能定义和形参同名的变量。
如果是基本的数据类型作为形参,则是纯粹的值传递,修改函数内部形参的值并不会影响到实参的值。
一个函数可以没有形参,也可以有无限个形参。
数据由实参传递给形参,具有单向传递性,不可逆。
函数的返回值
return1. 作用:从被调函数返回到主调函数继续执行,返回时可以附带一个返回值,返回值由return后面的参数指定。如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码)。
2. 返回值使用注意:
①. C语言是弱语法弱类型的语言,非常不严格。
②. 如果没有写清楚返回值的类型,则默认为int型的。
③. Void代表没有返回值。
④. C语言默认情况下,不允许有两个同名的函数。
函数使用注意
默认不允许函数重名,计算机分辨不出来到底该调用哪一个。函数之间是平等的,不能够嵌套定义。(可以嵌套调用,不可以嵌套定义)
函数不可以重复定义,但是可以重复声明,只要是在调用前声明就可以,地方随便。
函数如果是只有声明没有定义,那么编译可以成功,但链接时会失败。
函数如果在调用时,函数定义在调用之后,且前面没有进行相应的声明,则编译器报错。
函数分类
无参、无返回值void hello(){ printf("hello world!\n"); } int main() { hello(); return 0; }
无参、有返回值
int peopleCount(){ return 20; } int main() { int a = peopleCount();//无参有返回值 printf("%d\n",a); return 0; }
有参、有返回值
int max(int a,int b){ return a > b ? a : b; } int main(int argc, const char * argv[]) { int a = max(20,30);//有参有返回值 printf("%d ",a); return 0; }
有参、无返回值
void number(int a){ printf("%d\n",a); } int main(int argc, const char * argv[]) { number(5);//有参无返回值 }
递归函数
递归函数:一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言函数可以递归调用。递归条件:
可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。
可以应用这个转化过程使问题得到解决。
必定要有一个明确的结束递归的条件,否则程序会崩溃。
直接递归:
示例:斐波那契数列
#include<stdio.h> static long fibonacci(int n){ if(n==1||n==2) { return 1; }else { return fibonacci(n-2)+fibonacci(n-1); } } int main(){ int n,i; printf("Input n:"); scanf("%d",&n); for(i=1; i<=n; ++i){ printf("%ld\n",fibonacci(i)); } return 0; }
间接递归:
#include <stdio.h> char yy(int a); char zz(int a) { if(!a){ return 'z'; } else { return yy(--a); } } char xx(int a) { if(!a){ return 'x'; } else { return zz(--a); } } char yy(int a) { if(!a){ return 'y'; } else { return xx(--a); } } int main() { printf("%c\n",yy(6)); return 0; }
函数嵌套
C语言中不允许作嵌套的函数定义。因此各函数之间是平行的,不存在上一级函数和下一级函数的问题。但是C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。其关系可表示如图。![](http://hiphotos.baidu.com/exp/pic/item/d041a4a1cd11728b48642dd7cdfcc3cec2fd2cbe.jpg)
图中表示了两层嵌套的情形。其执行过程是:执行main函数中调用a函数的语句时,即转去执行a函数,在a函数中调用b 函数时,又转去执行b函数,b函数执行完毕返回a函数的断点继续执行,a函数执行完毕返回main函数的断点继续执行。
示例:计算5!+ 10!
#include <stdio.h> int factorial(int n){ if (n == 1) { return n; } else { return n *= factorial(n-1); } } int sum(int a, int b){ return factorial(a) + factorial(b); } int main() { int a = 5, b = 10; int resoult = sum(a,b); printf("10!+20! = %d\n",resoult); return 0; }
总结
1.函数可以大大提高代码的复用率。2.数据由实参传递给形参,具有单向传递性,不可逆。
3.一个函数在它的函数体内调用它自身称为递归调用。
4.函数不可嵌套定义,但是可以嵌套调用。
练习
1.河内之塔:创世纪时Benares有一座波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,而也就是世界末日来临之时。 答案相关文章推荐
- 如何组织构建多文件 C 语言程序(二)
- 如何写好 C main 函数
- Mootools 1.2教程 函数
- autoit InputBox 函数
- 文件遍历排序函数
- 关于C#中排序函数的总结
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页
- ASP下经常用的字符串等函数参考资料
- PostgreSQL教程(五):函数和操作符详解(1)
- DOS批处理 函数定义与用法
- asp Chr 函数 数字转字母的方法
- Lua中的函数精讲笔记
- Lua中的闭合函数、非全局函数与函数的尾调用详解
- Lua中调用C++函数示例
- Lua和C语言的交互详解
- Lua实现split函数
- Lua常用时间函数使用实例
- Lua函数与字符串处理简明总结
- Lua学习笔记之表和函数
- Lua中实现sleep函数功能的4种方法