C语言函数递归

1.什么是递归

       递归是一种编程范式,指的是一种函数直接或间接地调用自身的现象。在递归中,函数会在执行过程中重复调用未完成的版本,每次调用都会处理相同问题的一个更简单的实例,直到达到一个基本情况,这个基本情况是递归能够直接给出答案的简单情况。
        递归可以用来解决可以分解为更小相似问题的大问题。例如,计算一个数的阶乘、生成斐波那契数列、进行树状分解等。递归的核心思想是将复杂问题分解为更小的、与原问题有着相同形式的子问题。

1.1 递归的思想

把⼀个⼤型复杂问题层层转化为⼀个与原问题相似,但规模较⼩的⼦问题来求解;直到⼦问题不能再
被拆分,递归就结束了。所以递归的思考⽅式就是把⼤事化⼩的过程。
递归中的递就是递推的意思,归就是回归的意思,接下来慢慢来体会。
 

2.递归的限制条件

递归在书写的时候,有2个必要条件:

  • 递归存在限制条件,当满⾜这个限制条件的时候,递归便不再继续。
     
  • 每次递归调⽤之后越来越接近这个限制条件。

3.递归的举例

3.1阶乘

阶乘是一个经典的问题,可以用递归来解决。阶乘函数 n!n! 定义为:
n! = n \times (n-1) \times (n-2) \times \ldots \times 2 \times 1n!=n×(n−1)×(n−2)×…×2×1
例如, 5! = 5 \times 4 \times 3 \times 2 \times 1 = 1205!=5×4×3×2×1=120。

在这个例子中,基本情况是 n = 0,此时返回1。对于其他情况,我们递归地调用 factorial(n - 1)。

n的阶乘的递归公式如下:
C语言函数递归_第1张图片

那我们就可以写出函数Fact求n的阶乘,假设Fact(n)就是求n的阶乘,那么Fact(n-1)就是求n-1的阶
乘,函数如下:
C语言函数递归_第2张图片

测试:

C语言函数递归_第3张图片

测试结果为:

3.2 斐波那契数列

斐波那契数列是一个数列,其中每个数字是前两个数字的和。数列的开始是这样的:0, 1, 1, 2, 3, 5, 8, 13, …。
我们可以用递归来计算斐波那契数列的第n项:

C语言函数递归_第4张图片

在这个例子中,基本情况是 n = 0n=0 和 n = 1n=1,分别返回0和1。对于其他情况,我们递归地调用 fibonacci(n - 1) 和 fibonacci(n - 2)。

4.递归的注意事项

  • 栈溢出:递归调用可能会导致大量的函数调用,如果问题规模很大,可能会耗尽系统资源。为了避免这种情况,可以考虑使用循环而不是递归来解决问题。
  • 效率:递归调用会导致大量的函数调用,从而降低效率。在实际编程中,应该尽量寻找能够使用循环解决的问题,以提高效率。
  • 调试:递归调用可能会导致难以发现的bug,特别是在复杂的代码中。因此,在编写递归函数时,应该注意调试和测试,以确保其正确性。

5.总结

递归是C语言中一个强大的工具,能够解决许多复杂的问题。但是,在使用递归时,需要注意避免栈溢出、提高效率以及调试困难等问题。通过理解递归的基本原理和注意事项,开发者可以在实际编程中更好地使用递归。

你可能感兴趣的:(算法,c语言)