C通过运行时堆栈支持递归函数的實现递归函数就是直接或间接调用自身的函数。
接下来大家先看一个程序案例:
这个程序将二进制整数转换为字符
注意:切忌要为递归設置限制条件再本例代码中由于quotient的值越来越小,所以递归最终会终止
我们来继续来观察这个递归函数,假定我们以4567这个值调用递归函數当函数开始执行时堆栈的内容如下图所示:
执行除法算法后,堆栈内容如下:
接着if语句判断出quotient的值非零,所以对该函数执行递归调鼡直到 quotient值为零 ,堆栈内容如下:
到现在为止都是不断的由于递归调用使这些语句重复执行所以它的效果类似循环:但是注意 递归调用將会保存一些信息,也就是保存在堆栈中的变量值
现在 quotient 的值变为了0 递归函数便不再调用自身,而是开始打印输出然后函数返回,并开始销毁堆栈上的变量值
每次调用putchar得到变量value的最后一个数字,方法是对 value进行模10 运算然后把字符打印出来。
由与堆栈 先进后出 的原则所以依次从栈顶取出元素并对其变量销毁
直到整个递归结束,这个递归函数就彻底返回到其他函数调用它的地点
如果你把打印的字符一个接著一个排在一起出现在屏幕上,你将看到正确的值:4567
许多问题是以递归的形式进行解释的这只是因为它比非递归形式更为简洁,但是在实际开发中迭代实现往往比递归实现效率更高,虽说可读性差一些当一个问题相当复杂,难以用迭代实现时此时递归实现的简洁性便可以补偿它所带来的的运行时的开销。
之后大家再来看一下用递归计算阶乘:
是不是发现其实递归很有意思呢
本文总结与C和指针第七嶂同时希望能够对大家起到帮助,也欢迎大家批评指正
发布了3 篇原创文章 · 获赞 0 · 访问量 96