2024年10月17日 13:33

This commit is contained in:
许大仙 2024-10-17 05:33:54 +00:00
parent 9e6faf093b
commit 8b24f228f1

View File

@ -768,14 +768,20 @@ int main() {
} }
``` ```
* 要合理的使用递归解决实际问题,需要`注意`递归的`三要素`
> [!CAUTION] > [!CAUTION]
> >
> * ① 递归函数包含了一种`隐式`的循环。 > * ① 递归体(体现`递`的过程):
> * ② 递归函数会`重复执行`某段代码,但这种重复执行无需循环控制。 > * 函数内部递归调用自身的部分。
> * ③ 递归一定要向`已知方向`递归,否则这种递归就变成了`无穷递归`,停不下来,类似于`死循环` ,最终导致 `栈内存溢出` > * 递归体式递归思维的核心:它表示如何将一个大规模的问题`递推`为较小的、相似的子问题。这一分解过程持续的缩小问题的规模,以便更加方便和容易的处理问题。
> * ④ 递归函数的成功执行,需要满足以下两个条件: > * ② 递归的出口(体现`归`的过程):
> * 必须有一个明显的结束条件。 > * 当子问题已经足够小或者满足某种条件的时候,我们就不再继续分解,而是开始返回答案。其中,这些条件或某种条件就是递归的出口。
> * 必须有一个趋近于结束条件的趋势。 > * 明确的递归出口是至关重要的。如果没有明确的出口,递归将可能无限进行(类似于死循环),直到耗尽资源并导致栈溢出。通过递归的出口,我们实现从`递`到`归`的转换,并开始逐步合并或组合子问题的答案。
>
> * ③ 递归的深度:
> * 每次递归调用都会加深调用的层次,这可以被看作是递归中`递`的深度。
> * 控制递归深度是至关重要的。因为一个过深的递归不仅会增加计算的复杂性,还可能会导致栈溢出。合理的深度能够确保我们在`递`的过程中不会过分深入,同时在`归`的过程中能够有效的返回和组合答案。
### 2.1.3 应用示例 ### 2.1.3 应用示例