> 文章列表 > 【C语言】基础语法4:函数和递归

【C语言】基础语法4:函数和递归

【C语言】基础语法4:函数和递归

上一篇:控制流程结构
下一篇:数组和指针

❤️‍🔥前情提要❤️‍🔥
  欢迎来到C语言基本语法教程
  在本专栏结束后会将所有内容整理成思维导图(结束换链接)并免费提供给大家学习,希望大家纠错指正。本专栏将以基础出发,在之后的教程中将会不断学习并详细讲解C语言的基本语法及其高级用法
  上一节讲了C语言基础中的控制流程结构,接下来让我们来一起学习C语言中的函数递归
请添加图片描述

  🍪本教程内容干货满满,跟上步伐吧~🍪


作者介绍

🎓 作者:某不知名编程爱好者📜
🗒️系列文章&专栏推荐: 🔗《华为机试题解析》 、🔗《C语言程序设计》、🔗 《MySQL数据库》
🕸️为大家推荐一款很好用的C语言刷题网站🔗点击跳转


🔖导航小助手🔖

  • 📑 函数和递归
    • 🏷️ 1. 函数的定义与声明
    • 🏷️ 2. 函数的调用与返回值
    • 🏷️ 3. 函数参数的传递方式
    • 🏷️ 4. 函数的重载与递归
    • 🏷️ 5. 递归的调用栈与堆栈溢出
    • 🏷️ 6. 递归与迭代的比较
  • ⚠️ 注意事项
  • 🌰 附:阶乘函数的完整代码示例
    • 🎀小结

📑 函数和递归

  • 函数是C语言中非常重要的概念,它可以将一段代码块封装起来,方便调用复用。在本文中,我们将介绍C语言函数的基础知识和递归的实现原理。

🏷️ 1. 函数的定义与声明

  • 函数是C语言中的一个代码块,它可以接受参数返回值。函数的定义包括函数名参数列表函数体,例如:
int add(int a, int b)
{return a + b;
}

这个函数名为add,接受两个int类型的参数a和b,返回它们的和。

  • 在使用函数之前,需要将其声明,告诉编译器函数的返回值类型函数名参数列表。例如:
int add(int a, int b);

这个声明告诉编译器有一个名为add的函数,它接受两个int类型的参数,返回一个int类型的值。


🏷️ 2. 函数的调用与返回值

  • 调用函数时,需要使用函数名参数列表来调用函数。例如:
int sum = add(3, 5);

这个语句将调用add函数,并将3和5作为参数传递给函数。函数执行完毕后,将返回8,将其赋值给变量sum。


🏷️ 3. 函数参数的传递方式

  • C语言中函数参数的传递方式有两种:值传递指针传递

  • 值传递是指将参数的值复制一份传递给函数。在函数内部,对参数的修改不会影响到原始的参数。例如:

void increment(int a)
{a++;
}int main()
{int x = 3;increment(x);printf("%d\\n", x); // 输出3return 0;
}

在这个例子中,increment函数接受一个int类型的参数a,并将其加1。在main函数中,我们将x的值传递给increment函数,但是函数内部对a的修改不会影响到x的值。

  • 指针传递是指将参数的地址传递给函数。在函数内部,可以通过指针修改原始参数的值。例如:
void increment(int *a)
{(*a)++;
}int main()
{int x = 3;increment(&x);printf("%d\\n", x); // 输出4return 0;
}

在这个例子中,increment函数接受一个int类型的指针a,并将其指向的值加1。在main函数中,我们将x的地址传递给increment函数,函数内部通过指针对x的值进行修改。


🏷️ 4. 函数的重载与递归

  • C语言不支持函数重载,也就是说不能定义多个同名的函数,它们的参数列表不同。但是可以使用函数指针宏定义来实现类似的功能。

  • 递归是指函数调用自身的过程。递归函数必须有一个终止条件,否则会导致无限递归。例如:

int factorial(int n)
{if (n == 0)return 1;elsereturn n * factorial(n - 1);
}

这个函数计算n的阶乘。当n等于0时,返回1作为终止条件。否则,返回n乘以factorial(n-1)的结果。


🏷️ 5. 递归的调用栈与堆栈溢出

  • 递归调用会在内存中创建一个调用栈,用于存储每次函数调用的参数返回值。如果递归层数过多,调用栈可能会耗尽内存,导致堆栈溢出

  • 为了避免堆栈溢出,可以使用迭代算法尾递归优化。迭代算法是指使用循环代替递归实现同样的功能。尾递归优化是指将递归函数转换为迭代函数,可以减少调用栈的使用


🏷️ 6. 递归与迭代的比较

  • 递归和迭代都可以实现同样的功能,但是它们的效率空间复杂度不同递归的优点是代码简洁易懂,适合处理递归结构和树形结构迭代的优点是效率高,适合处理大规模数据和循环结构

⚠️ 注意事项

  • 编写函数时应该考虑代码的可读性可维护性
  • 使用递归时应该注意控制递归深度,避免出现栈溢出等问题。
  • 使用全局变量时应该注意避免命名冲突不必要的依赖关系
  • 调用函数时应该注意参数的类型和数量,以及返回值的类型和意义

🌰 附:阶乘函数的完整代码示例

#include <stdio.h>int factorial(int n)
{if (n == 0)return 1;elsereturn n * factorial(n - 1);
}int main()
{int n = 5;int result = factorial(n);printf("%d的阶乘是%d\\n", n, result);return 0;
}

上一篇:控制流程结构
下一篇:数组和指针


🎀小结

函数

  • 函数是C语言中的基本组成单元,可以将一个大程序分解为若干个小程序,使程序结构更加清晰
  • 函数的定义包括函数类型函数名参数列表函数体
  • 函数的调用需要提供参数,可以通过值传递指针传递来实现。
  • 函数可以有返回值,也可以没有返回值。如果没有返回值,则使用void关键字表示。
  • 在函数内部可以使用局部变量全局变量局部变量只在函数内部有效全局变量则在整个程序中都有效

递归

  • 递归是一种函数调用自身的方法,在处理一些具有重复性质的问题时非常方便。
  • 递归需要满足两个条件:基准情形(终止条件)和递归情形(继续调用自身)。
  • 递归可能会导致栈溢出等问题,需要注意控制递归深度

⚡恭喜你的内功又双叒叕得到了提高!!!🔋

🔚以上就是C语言函数和递归的全部知识了~

🤗感谢大家的阅读~

📬后续还会继续更新💓,欢迎持续关注哟~📌

💫如果有错误❌,欢迎指正呀💫

✨如果觉得收获满满,可以点点赞👍支持一下哟~✨


在这里插入图片描述


周公解梦