引入递归
在调用函数
的过程中又出现直接或者间接调用函数本身
,称为函数的递归调用
。
直接调用:
1 | int test(int x){ |
这就是直接调用,即在本函数体内,再次调用其自身。
间接调用:
1 | int test (int x){ |
上面就是间接调用了,虽然函数体本身并没有调用自身函数,但是调用了其他函数,其他函数又掉用了其主调函数,这就是简介的进行递归。
高树靡阴,独木不林。
在调用函数
的过程中又出现直接或者间接调用函数本身
,称为函数的递归调用
。
直接调用:
1 | int test(int x){ |
这就是直接调用,即在本函数体内,再次调用其自身。
间接调用:
1 | int test (int x){ |
上面就是间接调用了,虽然函数体本身并没有调用自身函数,但是调用了其他函数,其他函数又掉用了其主调函数,这就是简介的进行递归。
前面我们说,要使用一个函数必须经过两个步骤,声明函数和定义函数,现在我们来讲讲函数的声明。
1 | #include <stdio.h> |
上面我们声明了一个函数,函数的名字叫做 max ,返回值类型为 int ,含有两个参数,两个参数的类型都是 int 型。将这些信息告诉编译器之后,编译器就能知道 max 的作用了。
注意
函数声明需要在主调函数内进行,但是如果已经在之前(主调函数前)声明的函数,第二次调用时,不用再次声明。
总之,原则就是,先定义再使用,如果后定义,那就先声明再使用。声明之后,声明位置之后的函数再次调用,不必再次声明。
前面我们讲到为何要使用函数,以及为何要把功能封装到函数中,今天我们就来讲如何来定义和使用函数。
为什么要定义函数呢?因为在 C 语言中,所用到的所有函数
,都必须先定义,后使用
。先要将函数的一些基本信息通知编译系统,这样在程序执行该函数时,编译系统才能按照预先指定的功能执行。
定义函数需要包括一下几个内容:
函数的名字
,用于在后期调用。函数的类型
,也就是函数返回值的类型
。参数的名字和类型
,在后期调用时,向其传递数据,当然了,也可以没有参数
。函数的功能
,即函数需要做什么,对数据进行什么样的处理。这事最重要
的,也是函数体中的主要内容
。
说起函数,我们最熟悉的就是main 函数
因为我们写 C 语句
的时候,必须包含
main 函数。我们的输入、输出甚至数据的处理都从一个 main 函数中进行,但是随着程序的规模越来越大,单纯使用 main 函数已经无法满足后期维护和编写的需求。并且我们在程序运行中,需要重复使用某个功能时,要一遍又一遍的写,非常麻烦,所以我们就引入函数这个概念。把一个庞大程序的功能封装到一个一个函数中
,然后把各种功能的函数组装在一起,实现我们程序所需要的功能。
函数是从英文 function 中翻译过来的,function 在英文中也有功能的意思,所以我们的函数也就是功能,函数就是用来完成一个又一个的功能的。
现在,我们要输出这样的一条信息
1 | ********************** |
因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34…
即开始有一对儿兔子,然后3个月后兔子长大了,这对兔子会生一对儿兔子,之后的每个月这对儿兔子又生一对儿,假设兔子不会死亡,那么 N 个月后有多少对儿兔子。
数列:1、1、2、3、5、8、13、21、34…
找到数列的规律之后,我们发现,3号数是1号+2号,6号数是4号+5号,即该数前两个数的和。
1 | #include <stdio.h> |
我们刚才讲了,如何使用 C 语言中的两种循环语句,For循环
和do...while循环
,那么这些循环能否像if...else...语句
一样能够彼此嵌套呢?答案是肯定到,循环也可以进行嵌套,并且通过嵌套,我们可以更加灵活的使用循环的各种特点。当然了,我们甚至也可以改变循环的执行状态,让循环在我们需要的时候跳出。
首先我们先看看几种循环的比较,找到这些循环的特点。
1、三种循环的运行机制都差不多,计次、执行循环体、增量变量,所以可以相互替换使用。
2、while 循环
和do...while循环
都是在 while 后面的括号中增加判断条件,来判断是否执行下一轮循环,所以在循环体中,要对这个判断条件施加一些设定,让循环能够及时的退出。
3、凡是用 while 循环写的,都可以用 for 循环实现。
4、while 循环
、do...while循环
和for 循环
都可以使用 break 语句跳出循环,使用 continue 语句结束本次循环。(这两个语句详见下方)
在看完了 while 循环之后,我们发现,一个循环最重要的有三件事,循环次数、判断条件、循环后递增条件。比如我们在使用 while 循环的时候,就要实现定义一个计次变量,然后每次循环后累加这个变量,使得我们能够在满足条件时及时的跳出循环。而 for 循环则是将这一切变得更容易了!
我们先看一个例子,来对比一下 for 循环和 while 循环,同样是那个1~30累加的例子。
1 | //以下是 while 循环的写法 |
为什么需要循环呢?比如,你遇到了…1+2+3+4+5
遇到这样的数累加,加到5加到10可能都没问题,加到10000呢..1+2+3+...+10000
是不是就崩溃了…
为了能让计算机能够进行多次运算,所以就有了循环的出现。
在 C 语言中,一共有两种循环,一种是 while 循环另一种是 for 循环,我们先来说 while 循环。
如果我们需要计算1~30的累加,即1+2+3+...+30
该如何写呢?
如果是以前,我们可能要一个一个的输入,但是现在我们引入了 while 循环,就可以通过一个循环来完成这件事了~
1 | #include <stdio.h> |
上一篇介绍了 if 语句只有两个分支可供选择,而实际问题往往有更多种可能性,虽然 if 语句
可以嵌套使用
,但整个代码会变得冗长难懂
,后期维护成本和修改成本都很高,所以 C 语言提供 swich 语句直接处理多分支选项。
我们设计一个程序,当我们输入 A~E 的成绩等级后,返回该等级对应的分数,我们当然可以使用if 语句来写,如果是 A 等级还好,如果是 E 等级,我们需要判断很多次才能知道,如果使用 switch,我们就可以对指定的条件返回指定的内容,哪怕分支再多也可以轻松应对。
1 | #include <stdio.h> |
在 C 语言中有两种条件判断语句,if 语句
和 switch 语句
,if 语句
实现的是双分支
的选择结构,swicth 语句
实现的是多分支
的选择结构。
if 语句是一个双分支选择结构,通过条件表达式的结果
判断程序是执行 if 语句模块还是 else 语句模块。
if (表达式)语句1
[else 语句2]
表达式
可以是关系表达式、逻辑表达式或者数值表达式。else 和 语句2
为可选内容,可以有也可以没有。