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