函数
函数是指将一组能完成一个功能或多个功能的语句放在一起的代码结构。在C语言程序中,至少会包含一个函数,主函数main()。本章将详细讲解关于函数的相关内容。
1、库函数
⭕️C语言库函数是指在C语言标准库中预先定义好的函数,这些函数包含在相应的头文件里,每个函数都有其函数名、返回值类型和函数参数;这些函数用于执行常见的任务,例如输入输出、字符串处理、内存操作等。
⭕️C语言标准库是一组标准化的函数和工具,旨在为C语言程序员提供基本的编程支持。库函数通常以源代码形式或预编译形式提供,可以直接在C程序中使用,而无需从零开始编写这些功能的代码;以下情况使用的函数都属于库函数:
🔶比如我们想把程序结果打印到屏幕上看看,会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上(printf)。
🔶在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。
🔶在编程是我们也计算,总是会计算n的k次方这样的运算(pow)。
#include <stdio.h>
2、自定义函数
❓如果库函数能干所有的事情,那还要程序员干什么?
⭕️所以更加重要的是自定义函数;自定义函数和库函数一样,有函数名,返回值类型和函数参数,但是与库函数不一样的是这些都是我们自己来设计,这就给程序员了一个很大的发挥空间。
👉我们来看一个自定义的函数实现找出两个整数中的最大值:
#include <stdio.h>
//get_max函数的设计
int get_max(int x, int y)
{
return (x>y)?(x):(y);
}
int main()
{
int num1 = 10;
int num2 = 20;
int max = get_max(num1, num2);
printf("max = %d\n", max);
return 0;
}
3、函数的组成
👉一个C语言函数通常由以下几个部分组成:
💠返回类型:指定函数返回的数据类型。如果函数不返回任何值,则使用 void 。
💠函数名:函数的名称,用于调用该函数。
💠参数列表:一组定义在圆括号内的参数,用于接受调用者传递给函数的数据。参数可以是多种数据类型,甚至是其他函数。
💠函数体:包含在花括号 { } 中的代码块,这里包含了函数执行的具体逻辑。
⭕️其中返回类型指定了函数执行完毕后返回的数据类型,可以是整型、字符型、等,如果函数不返回任何值,则使用 void。例如,int 表示函数返回一个整数,void 表示函数不返回任何值。
⭕️函数名是函数的标识符,用于在程序中调用该函数。我们在写函数时,函数名应该清晰地反映函数的目的或行为。
看看会输出什么?
#include <stdio.h>
void add(int x) {
x++;
}
int main() {
int x = 10;
add(x);
printf("%d", x);
return 0;
}
#include <stdio.h>
int add(int x) {
x++;
return x;
}
int main() {
int x = 10;
x=add(x);
printf("%d", x);
return 0;
}
函数递归
1、什么是递归?
程序调用自身的编程技巧称为递归( recursion);函数递归是指函数在执行过程中调用自身的一种技术。
2、递归的限制条件
递归在书写的时候,有2个必要条件:
- 递归存在限制条件,当满足这个限制条件的时候,递归便不再继续。
- 每次递归调用之后 越来越接近这个限制条件。
看看会输出什么?(根据代码理解上面两句话)
#include <stdio.h>
void digui() {
printf("Hello World\n");
digui();
}
int main() {
digui();
return 0;
}
没有递归结束条件(无限循环)X
#include <stdio.h>
void digui(int x) {
if (x == 0) {
return;
}
printf("Hello World\n");
digui(--x);
return;
}
int main() {
digui(3);
return 0;
}
有结束条件且每次递归调用之后 越来越接近这个限制条件 √
3、递归举例
阶乘
递归实现的过程
将5的阶乘分成4的阶乘乘5;
将4的阶乘分成3的阶乘乘4;
将3的阶乘分成2的阶乘乘3;
将2的阶乘分成1的阶乘乘2;
这样的思路就是把⼀个较大的问题,转换为⼀个与原问题相似,但规模较小的问题来求解的。直到n是1或者0时,不再拆解
最终将n的阶乘就写成n*(n-1)!
直到n是1或者0时,不再拆解
如果将阶乘写成一个函数Fact(n)
,
那么Fact(n)=n*Fact(n-1)
再稍微分析一下,当 n<=1 的时候,n的阶乘是1,其余n的阶乘都是可以通过上述公式计算。
n的阶乘的递归公式如下:
运行代码
#include <stdio.h>
int Fact(int n)
{
if (n <= 0)
return 1;
else
return n * Fact(n - 1);
}
int main()
{
int n = 0;
scanf("%d", &n);
int ret = Fact(n);
printf("%d\n", ret);
return 0;
}
斐波那契数列
在数学上,斐波那契数是以递归的方法来定义:
令F0 = 0; F1 = 1; 则Fn = F(n - 1) + F(n - 2),其中n ≥2。即——从数列的第三项开始,每一项的值等于前面两项之和,称为斐波那契数列。斐波那契数列的前几项如下所示 :
PS : 0不是第一项,而是第零项,斐波那契数列在文本上从1开始。
思路 :
设n代表斐波那契数列的第n项,当n等于1或者等于2时,可以直接返回1;当n大于2时,要想求出斐波纳契数列的第n项,必须知道它前面的两项分别是多少,而要想知道它前面的两项分别是多少,就又得知道这两项再分别往前的两项是多少,依次递归下去,直到n == 1或者n == 2的情况时,return 1;接着再逐层返回,回到你想求出的第n项。
代码如下
#include <stdio.h>
int fei(int x) {
if (x <= 2) {
return 1;
}
else {
return fei(x - 1) + fei(x - 2);
}
}
int main() {
int n;
scanf("%d", &n);
int ans=fei(n);
printf("%d", ans);
return 0;
}
最后提出疑问
输入一个数值n,输出1-n数字的全排列
例如 n=3
全排列为
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1