![算法训练营:海量图解+竞赛刷题(入门篇)](https://wfqqreader-1252317822.image.myqcloud.com/cover/621/39479621/b_39479621.jpg)
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
1.7 从前有座山,山里有座庙:递归之法
递归调用是函数内部调用自身的过程。递归必须要有结束条件,否则会进入无限递归状态,永远无法结束。
1. 递归函数
训练1-32:输入n个整数,倒序输出所有整数。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/036-1.jpg?sign=1739286193-kHvL3oe5ULFI13JbJDmJtVchx3G5uLwQ-0-ca569d97596a6f9fb2d4a03768d2a245)
2. 递归原理
递归包括递推和回归。递推指将原问题不断分解成子问题,直到达到结束条件,返回最近子问题的解;然后逆向逐一回归,最终到达递推开始时的原问题,返回原问题的解。
阶乘是典型的递归调用问题,5的阶乘递推、回归过程如下图所示。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/036-2.jpg?sign=1739286193-tfZePgJeiiBlKpBtmImHIHEC9ZCl67iB-0-87c800bdb0811f97e554b2996a2de456)
训练1-33:输入一个整数n,输出n的阶乘。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/037-1.jpg?sign=1739286193-q3nnPQGmpAejGzDyQjvGaoMrmYzLos2s-0-a7d0b1c235ecb3742e254fab3defc0c9)
注意:在递归算法中,每一次递推都需要一个栈空间来保存调用记录,因此在计算空间复杂度时需要计算递归栈的辅助空间。
上图中的递推、回归过程是我们从逻辑思维上推理并用图形象表达出来的,但其在计算机内部是怎样处理的呢?计算机使用了一种被称为“栈”的数据结构,它类似于一个放了一摞盘子的容器,每次放进去一个,拿出来的时候就只能从顶端拿一个,不允许从中间插入或抽取,因此被称为“后进先出”(Last In First Out,LIFO)。
5的阶乘递推(进栈)过程的形象表达如下图所示,在实际递归中传递的是参数的地址。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/037-2.jpg?sign=1739286193-chquGrljJxeQXixjp5ffOjvVdYrjYE63-0-59349da0fc914d82d76c5c729cacdb72)
5的阶乘回归(出栈)过程的形象表达如下图所示。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/038-1.jpg?sign=1739286193-BF2HUTwzqmrb9cXysDMVe3XsOMf2hVTB-0-c254441b054a3749eed81af0060d4597)
从图中可以很清晰地看到,它首先一步步地把子问题压入栈,直到得到返回值,再一步步地出栈,最终得到递归结果。在运算过程中使用了n个栈空间作为辅助空间。
训练1-34:输入一个整数n,输出斐波那契数列的第n项。
斐波那契数列:1,1,2,3,5,8,13,21,34……
递归式表达式如下:
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/038-2.jpg?sign=1739286193-A9sNYVqyWVBD0VbT06zHXt9Yg5JDYgTU-0-c5f12d977df47648ecb46f6461edbee6)
以F(6)为例,递归求解过程如下图所示。
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/038-3.jpg?sign=1739286193-fsEzBa8I0p8qo6eBv0juwrxORdPOMZ8A-0-43dce42cc0df8a0920fc8f5a0124580a)
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/038-4.jpg?sign=1739286193-TiwOiu10dN6IpKU5kXMDLbBSxfQyFdT0-0-c9e2f58398162421dad310fe73b18444)
![](https://epubservercos.yuewen.com/41CA5A/20637464308667306/epubprivate/OEBPS/Images/039-1.jpg?sign=1739286193-GV2djnHXGhst3H4q6QAbOEvK7QWgjIJm-0-3c2a90d771291872e9a56364be3812de)
练习:写一个递归程序,输出1+2+3+…+n。