C语言学习篇-6函数、递归、嵌套

原创 2016年06月01日 21:17:54

说明:本文主要内容为C语言函数定义及使用,形参与实参的介绍,递归函数、嵌套函数的使用。

函数

函数

  1. 定义:一系列C语句的集合。 每个函数负责完成一部分的功能,函数将功能封装起来,以供程序调用。
  2. 目的:将一些常用的功能封装起来,以备调用,方便代码重用,便于维护。
  3. 步骤:确定函数名,确定函数体,调用。
  4. 格式:返回值类型 函数名 (形式参数列表){ 函数体 }
  5. 定义函数:
    • 取一个有意义的函数名
    • 确定形参列表
    • 编写函数体
    • 返回值

示例:两个数中较大的数

#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. 注意:

  • 形参和实参的个数必须相等。
  • 函数体内部不能定义和形参同名的变量。
  • 如果是基本的数据类型作为形参,则是纯粹的值传递,修改函数内部形参的值并不会影响到实参的值。
  • 一个函数可以没有形参,也可以有无限个形参。
  • 数据由实参传递给形参,具有单向传递性,不可逆。

函数的返回值

return
1. 作用:从被调函数返回到主调函数继续执行,返回时可以附带一个返回值,返回值由return后面的参数指定。如果函数执行不需要返回计算结果,也经常需要返回一个状态码来表示函数执行的顺利与否(-1和0就是最常用的状态码)。
2. 返回值使用注意:
①. C语言是弱语法弱类型的语言,非常不严格。
②. 如果没有写清楚返回值的类型,则默认为int型的。
③. Void代表没有返回值。
④. C语言默认情况下,不允许有两个同名的函数。

函数使用注意

  1. 默认不允许函数重名,计算机分辨不出来到底该调用哪一个。
  2. 函数之间是平等的,不能够嵌套定义。(可以嵌套调用,不可以嵌套定义)
  3. 函数不可以重复定义,但是可以重复声明,只要是在调用前声明就可以,地方随便。
  4. 函数如果是只有声明没有定义,那么编译可以成功,但链接时会失败。
  5. 函数如果在调用时,函数定义在调用之后,且前面没有进行相应的声明,则编译器报错。

函数分类

  • 无参、无返回值
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);//有参无返回值
}

递归函数

  1. 递归函数:一个函数在它的函数体内调用它自身称为递归调用。这种函数称为递归函数。C语言函数可以递归调用。
  2. 递归条件:
    • 可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的对象有规律地递增或递减。
    • 可以应用这个转化过程使问题得到解决。
    • 必定要有一个明确的结束递归的条件,否则程序会崩溃。

直接递归:

示例:斐波那契数列

#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语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用。即在被调函数中又调用其它函数。这与其它语言的子程序嵌套的情形是类似的。其关系可表示如图。
这里写图片描述
图中表示了两层嵌套的情形。其执行过程是:执行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语言中的函数的定义以及相关的调用、嵌套、递归以及和数组的关系

1、函数就是一个可以被多次调用的功能模块。 1)一个c程序有多个功能模块组成,一个模块可以有多个源程序文件。 (分别:编写、编译、提高效率) 2)一个源文件可以是一个或多个函数组成以及其他有关的内容组...

c语言中函数的嵌套调用(关于函数声明的一个例子)

###############################例子全部来源于谭浩强版c语言#################################### include int...

C语言main函数中嵌套定义函数

第一次写博客啊,心情好激动。。。   问题引入: 今天

Delphi7高级应用开发随书源码

  • 2003年04月30日 00:00
  • 676KB
  • 下载

什么是函数嵌套和递归

解释一: 函数的嵌套调用是在函数调用中再调用其它函数,函数的递归调用是在函数调用中再调用该函数自身。 解释二: 函数嵌套是语言特性,递归调用是逻辑思想。 函数嵌套允许在一个函数中调用另外一个函...

不一样的Javascript(10)——函数嵌套

1. 在Javascript中,函数中可以嵌套其他函数。例如: function distance(x1, y1, x2, y2) { function square (x) { ...

C语言函数嵌套定义问题

几乎所有的C语言教材上都说C语言函数可以嵌套调用,但不可以嵌套定义。实际上,函数能否嵌套定义与编译器有关,在GCC编译器下嵌套定义没问题,可以正常运行,我在code blocks 和 Dev C++两...
  • bufanq
  • bufanq
  • 2017年03月04日 21:52
  • 477

为什么C 没有嵌套函数?

为什么C 没有嵌套函数? 实现嵌套函数不是件简单的事, 它们需要可以正当的访问包含函数的本地变量, 为了简单化, 这个功能是被故意舍弃的。gcc 的扩展功能允许函数嵌套。许多可能使用嵌套函数的地方(例...
  • Augusdi
  • Augusdi
  • 2014年06月10日 11:14
  • 768

使用LiveCD制作Linux Ubantu系统img镜像文件

一、制作Linux LiveCD 安装到U盘 1.      1. 下载Cent OS 的liveCd的iso光盘镜像,使用虚拟机安装,或者使用DVD光盘刻出来(我使用的是虚拟机,更加方便,注意下载的...

Arduino携手LCD1602 向世界问好“hello World!”

LCD1602 LCD1602是一款简易的液晶显示屏,可以显示16X2的 字符,包括数字,英文,但不包含中文。 本例程使用的是简易接线的方法 引脚图 1602采用标准的16脚接口,其中: ...
  • ling3ye
  • ling3ye
  • 2016年05月11日 12:04
  • 4313
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言学习篇-6函数、递归、嵌套
举报原因:
原因补充:

(最多只允许输入30个字)