)
在C语言的基础学习中我们已经学会了循环语句的使用回顾一下已经学习了for/while/do while循环语句知识前提栈帧循环if语句函数的运用什么是函数递归函数在函数体内调用自身的方法就叫做函数递归,下面是简单的函数调用自身称为直接递归void home() { home(); }循环顾名思义就是重复执行代码而函数递归则是函数在条件前提下调用自身其运行程度往往比循环更加复杂。但函数递归的代码相比循环语句而言更加简洁循环语句的表达往往更加繁琐。接下来我将用一个简单的例子-斐波那契数的计算运用函数递归先回顾一下斐波那契数的定义从第二项开始后面的每一项等于前两项之和先写出主函数main()定义一个整数型变量n初始值为0使用scanf函数读取一个整数存入n的地址。int main() { int n 0; scanf(%d,n); return 0; }接着我们在主函数之前对斐波那契函数进行定义给函数起名为fib类型为int需要知道斐波那契数的前两项是特殊的即0和1需要判别scanf函数输入的是否为第0项或第1项以及给出相应的返回值并给出正常项的返回值。其中前两项我们可以利用if语句轻松实现定义int类型的n主函数已初始为0int fib(int n) { if(n 0) return 0; else if(n 1) return 1; }前两项讨论完接下来再写正常项的返回值及第3~正无穷项此时涉及函数递归思想可以理解为套娃int fib(int n) { if(n 0) return 0; else if(n 1) return 1; else return fib(n - 1) fib(n - 2); }如果scanf给出4则直接先来到else的返回值程序开始计算fib(3) fib(2)就发生类似套娃效应fib(3)又来到else的返回值程序开始计算fib(2) fib(1)而这两次得到的fib(2)又要返回到else的返回值计算fib(1) fib(0)直至可直接回归返回值只有fib(1)和fib(0)暂时没找到好用的画图工具一旦找到会给出清晰的图解也可借助ai生成帮助理解此时我们再来返回到主函数区块完善主函数定义一个变量r赋予函数fib(n)的返回值再将其打印出来最终得到我们完整的主函数int main() { int n 0; scanf(%d,n); int r fib(n); printf(%d\n,r); return 0; }头文件应该不用再强调毕竟初学这里还是强调一下#define _CRT_SECURE_NO_WARNINGS #include stdio.h此时我们对于斐波那契数的计算已经实现运行输入项数即可但是我们会发现随着项数的增加程序的计算时间也会增加甚至发生卡顿现象这是因为虽然代码看起来十分简洁但是程序背后会经历十分庞大的运算可搜斐波那契数金字塔相关图献加以了解其数字运算的庞大例如n50运算时长可能长达30秒若数字庞大也存在超出int范围的风险此时需改用long long简洁来说在计算庞大的前提下递归程序会影响性能因为程序的每一次函数调用都需要为本次函数调用在内存的栈区申请一块内存空间来保护函数调用期间的各种局部变量的值这块空间叫作运行时堆栈即函数栈帧函数不返回函数对应的栈帧空间会一直占用所以如果函数调用中存在递归调用的话每一次递归函数调用都会开启属于自己的栈帧空间直到函数递归不再继续开始回归然后才逐层释放栈帧空间采用函数递归的方式完成代码递归层次太深会浪费很多栈帧空间可能会引起栈溢出的情况即可能发生崩溃优化栈溢出的方式可以采用尾溢出但是部分编译器不支持也没过多了解这里不再给出实例由以上斐波那契数的实例结合之前学过的循环语句我们可以总结出以下当一个问题非常复杂难以用循环的方式实现此时可以考虑递归的简洁性递归的深度在一定范围内不会造成大量堆积可以大胆使用递归写法也可用ai辅助理解与优化代码ps内容可能存在不严谨的部分以上仅为个人观点最后修改时间2026 8 26 23:58内容仅为个人学习C语言过程中的记录不具有权威性不足的地方欢迎指出