一、什么是递归函数

(1)递归函数即自调用函数,在函数内部直接或间接地自己调用自己,即函数的嵌套调用是函数本身。

从字面上来看递归,递即递推,采用循环的思路来描述复杂问题的方法。在递推阶段每一个递归调用通过进一步调用自己来记住这次递归过程,当其中调用满足终止条件时,递推结束。归即回归,函数调用已逆序的方式回归,知道最初调用的函数返回为止,此时递归过程结束。举个例子:

怎么理解c语言递归(论C语言递归)(1)

加群466572167,群内有资料学习

怎么理解c语言递归(论C语言递归)(2)

加群466572167,群内有C/C 资料学习

这里有一个问题一定要注意,就是static int sum = 0;

有些人就不明白,为什么要使用 static 类型修饰符,为什么不使用 int sum=0;?如果使用 int sum=0; 这样的语句,在每次调用函数add()的时候,sum的值都是赋值为0,也就是第一步虽然加了1上来,可是第二次调用的时候,sum又回到了0。我们前面说了,static能保证本次初始化的值是上次执行后的值,这样也就保证了前面想加的结果不会丢失。如果你修改为int sum=0,最后结果一定是最后结果是5而不是15。

怎么理解c语言递归(论C语言递归)(3)

加群466572167,群内有C/C 资料学习

上面的例子就很好的解释了,被调用函数运行的栈空间独立于调用函数的栈空间 这句话。

三、递归调用的形式

递归函数有直接递归调用和间接调用两种形式.

直接递归即在函数出现调用函数本身,例如:

怎么理解c语言递归(论C语言递归)(4)

加群466572167,群内有C/C 资料学习

间接递归调用指函数中调用其他函数,而该其他函数却又调用了本函数。例如:

怎么理解c语言递归(论C语言递归)(5)

加群466572167,群内有C/C 资料学习

下面,再扩展一种递归,尾递归

当递归调用是整个函数中最后执行的语句它的返回值不属于表达式的一部分时,这个递归调用就是尾递归的。

上面的直接递归例子的返回值是 return num*func(num-1); 是一个表达式自然不是尾递归了,将其改为尾递归:

怎么理解c语言递归(论C语言递归)(6)

加群466572167,群内有C/C 资料学习

当编译器检查到一个函数是尾递归的时候,它就会覆盖当前活跃记录而不是在栈中去创建一个新的,这样就解决了普通递归函数占用栈空间过大的问题。遗憾的是,大多数编程语言没有针对尾递归做优化,所以,即使把函数改成尾递归方式,也会导致栈溢出

小编就暂时把递归说到这,加小编的群466572167,群内有C/C 资料学习,下一篇的话继续接上,内容还是讲递归吧,基于太多,一下子写太多的话,各位看了也会累。

,