. Y, B0 n/ o$ X/ h i ] 关键要素 3 H# A* ~1 Q, `3 n1 d" @1. **基线条件(Base Case)** 9 e3 z0 n5 Q" r- B, R - 递归终止的条件,防止无限循环 $ V9 l! K. ]( \5 { - 例如:计算阶乘时 n == 0 或 n == 1 时返回 1% i* p7 Y, ?" \" h# x* s- @6 T
8 P: P9 X/ U6 ]2. **递归条件(Recursive Case)**3 Z" a/ ]+ V7 W" p: n
- 将原问题分解为更小的子问题 % l3 e7 q: h$ I! J4 h - 例如:n! = n × (n-1)! . A, v" _/ _$ r% h& `1 I \5 S! P- B+ Q; Q
经典示例:计算阶乘 & J1 s5 `$ l9 ^$ _python3 ~: }) r: J$ c! E$ L+ Q
def factorial(n): ' \, U( u# L9 y! H9 D if n == 0: # 基线条件- Y: H0 ?: x! n& n6 c) d! C1 T
return 1 + g. U1 s3 w( O% u$ Y& k ], H else: # 递归条件, Q& X: _- k) x4 h9 F
return n * factorial(n-1)7 T+ F0 y. E1 ?( T& G
执行过程(以计算 3! 为例):& Y# W' t- r$ `/ ?% R- e3 r
factorial(3) , f; X: d1 j) F- d- h3 * factorial(2)9 } e( K+ G' Y7 G
3 * (2 * factorial(1))+ ^* f5 K- |* e& K
3 * (2 * (1 * factorial(0))) ; H" K, a* L* A* G( `3 G3 * (2 * (1 * 1)) = 6! O* Q# Y% ~: m. L0 R1 G& V
# E0 Y1 [6 K# \( I/ q
递归思维要点 5 y2 w0 h4 Y$ u& T' B1. **信任递归**:假设子问题已经解决,专注当前层逻辑& ^9 B! q5 J1 r! t% }* d
2. **栈结构**:每次调用都会创建新的栈帧(内存空间)0 f" ?. I9 `" c. `$ u( X* v9 s
3. **递推过程**:不断向下分解问题(递)7 [- Q4 }5 {; F
4. **回溯过程**:组合子问题结果返回(归)& ^' ~% q* ]# r# g4 Z" p* G* z% G
5 @" W' v2 W% t0 b% `/ J1 ~+ l1 f
注意事项 / ^! N" Y# ~( P% f& `$ g必须要有终止条件( @2 X) ^$ S3 ^4 Z, c' f" Q* v
递归深度过大可能导致栈溢出(Python默认递归深度约1000层)5 {1 O0 r( N ~8 e$ q+ A: d- I
某些问题用递归更直观(如树遍历),但效率可能不如迭代( M# e' y1 J* q( I. V
尾递归优化可以提升效率(但Python不支持)9 F. e) e) n7 i% |$ s
4 |: T0 b4 w) E' {. [5 j 递归 vs 迭代 % j: O1 k/ c/ J| | 递归 | 迭代 |/ z7 D4 `2 j8 n; {
|----------|-----------------------------|------------------| : W. ~6 z6 ~9 ^| 实现方式 | 函数自调用 | 循环结构 | , T2 y( X& }+ v) s| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 |* k6 `# t$ z! U. `
| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 | " Q' Y! M+ Z2 o$ O; T" s| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 | ; b, d7 C$ U) {" I 8 n% j; u# R) p* M" L; @9 j 经典递归应用场景$ u. S) i. M) O* L2 a2 @
1. 文件系统遍历(目录树结构)- F. F2 v9 g0 O0 i6 y) a6 M" X# s
2. 快速排序/归并排序算法 ( l: w+ \8 z9 w2 G C' M5 c- v7 r, D( J3. 汉诺塔问题1 ~: y9 ?7 ^. `+ a h S6 a4 R
4. 二叉树遍历(前序/中序/后序)! d& m5 {3 E/ e6 u1 X
5. 生成所有可能的组合(回溯算法)/ ]" W% I, i1 \2 O
: `* O }: T0 ]3 m" o7 R# {
试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒, 4 {0 K5 ~ q3 s我推理机的核心算法应该是二叉树遍历的变种。 , v/ K( j0 g o另外知识系统的推理机搜索深度(递归深度)并不长,没有超过10层的,如果输入变量多的话,搜索宽度很大,但对那时的286-386DOS系统,计算压力也不算大。作者: nanimarcus 时间: 2025-2-2 00:45
Recursion in programming is a technique where a function calls itself in order to solve a problem. It is a powerful concept that allows you to break down complex problems into smaller, more manageable subproblems. Here's a detailed explanation:% p4 @) c9 R& j4 ?# m+ L* _
Key Idea of Recursion& X+ S" G8 d# Z" d2 k& L1 U
; }: f# F9 b2 t8 CA recursive function solves a problem by: $ h% P7 \# H. [4 X6 s* \9 ]% b5 ~3 y# y, e. B. g& o/ I7 m
Breaking the problem into smaller instances of the same problem.6 B1 n( w" B$ A' `
1 V S* G& |8 @ T3 ] Solving the smallest instance directly (base case).! L1 \" j* y! H# W, }% O$ O& ~
+ W3 v6 \0 C5 Q$ k* x6 x% P Combining the results of smaller instances to solve the larger problem.# M# z6 H4 u2 E- L2 t
- N6 O. d+ y. r4 h* o9 R
Components of a Recursive Function ( ^4 v5 `8 B1 T; F! Z# ~0 C- k K0 L9 w3 y, k; q) r
Base Case: 1 Z. N7 \8 Z; B" l `. P - l) N c( B5 X |1 V& W This is the simplest, smallest instance of the problem that can be solved directly without further recursion.9 c5 o3 ^5 d7 x j3 f: \5 H# H
0 ~8 L' ?/ F% X) o! ~0 R
It acts as the stopping condition to prevent infinite recursion.* K3 i; m* ?6 M& V( Y3 {
/ ^, r3 v# k% |9 `7 n _4 N Example: In calculating the factorial of a number, the base case is factorial(0) = 1. 1 L# p1 S; x1 V k3 G ( r* ^' v- @- g, e Recursive Case: " N6 k# Q) D' E* _/ b# h. j5 \, D' \( D Y+ v
This is where the function calls itself with a smaller or simpler version of the problem.3 A7 Y4 t: |" @8 h! \1 x
* n* ?6 I. F7 I2 G2 ] Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1).2 L1 {2 Q8 Q. O/ L: v O) X& w
3 L6 y) d' R2 M. S+ x a: P3 n8 \Example: Factorial Calculation( J( B, t8 ?) g2 c3 l0 g
# @1 M3 D. @+ [% r7 a2 f" k
The factorial of a number n (denoted as n!) is the product of all positive integers less than or equal to n. It can be defined recursively as: : D- ?0 [; v, ?/ k; H2 [, |8 I( L& E0 v) M* ]4 c2 V, T3 c
Base case: 0! = 1 : g1 D, V' {" I' i7 j) I * K$ {7 b6 ?) g1 K Recursive case: n! = n * (n-1)!7 x% u2 X/ M( j! e( Y6 |3 I
" R2 U. s" w! ^. eHere’s how it looks in code (Python): + j1 g% O& t8 v) epython7 R3 \ h6 H. h, V
8 J% H' w' ?. ~. @) \# ~9 V / B1 p6 }4 C9 ?& W6 `8 N/ @, Ddef factorial(n): # K5 P+ u( U ? Y, Y: n( E/ Q9 d" M # Base case * o1 ^/ o/ ~ Q+ R6 ~% v if n == 0:" J! H) f3 @! K$ C
return 1 ! ]5 O9 E" g( x0 S& G/ K # Recursive case - z' t7 y1 }) ~ else:4 `! K! [9 \+ G6 u0 v. p- R% m
return n * factorial(n - 1)# F6 M7 p. N! }3 y8 F# u
% l. g: G& |* |5 d6 G) X6 F: A) w# Example usage . k- s; s, b* H6 w# V6 Y, dprint(factorial(5)) # Output: 1202 f. o8 x" K: K" \3 K% o
4 f- `, ]( J+ UHow Recursion Works 2 L' i, @! L/ B8 z) S. ]0 e. p+ t ?1 O
The function keeps calling itself with smaller inputs until it reaches the base case." ~& C" m- K- f: j3 S
% C0 V3 Y, {8 u; e' C+ x" F
Once the base case is reached, the function starts returning values back up the call stack.# _- c5 c; M- Y$ G( M& ?' M( y
8 o! N# j: ~# Z2 E* U
These returned values are combined to produce the final result. i9 f% p1 {9 v1 |
% i1 V, _2 ?' J. [! [ Simplicity: Recursive solutions are often more intuitive and easier to write for problems that have a natural recursive structure (e.g., tree traversals, divide-and-conquer algorithms).3 t0 g9 A. J8 c2 b/ M; I4 J. l/ R. g
@; S; l6 h4 G
Readability: Recursive code can be more readable and concise compared to iterative solutions.8 K% |: H& ]4 D. E7 \
7 O1 {+ G# T; g* I& z( `Disadvantages of Recursion + A8 M. N5 D& ~* I# H& |: g- l( W2 _ ) v9 F2 @' L: f3 k- g2 `! T Performance Overhead: Each recursive call adds a new layer to the call stack, which can lead to high memory usage and potential stack overflow for deep recursion. $ K1 \7 g6 { Q8 k2 d; @8 I3 F! d+ X9 d1 S: P6 K
Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization). 2 } C* W" ^" F& t: T, `" ^% b6 V/ H2 ^6 B& ]
When to Use Recursion 4 G$ f* S1 w7 {$ n. c, l6 C# g1 E( h
Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort).# a5 K2 l7 [3 {
, \) W: k) P! I) W Problems with a clear base case and recursive case. / F* X! m6 T2 u4 X3 ~% I+ }1 q) s! d& r
Example: Fibonacci Sequence + [5 i" K: W( h, V) ^+ o6 N ; g5 e! w0 `9 A* H+ j2 yThe Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones: 6 M5 W6 {6 T% Y" @- d( `6 B6 X : B2 K5 c4 L" g) v) s( j6 I0 D Base case: fib(0) = 0, fib(1) = 1 4 M; }9 i% _! N3 |" ^) j. Z1 v9 s4 i! Z3 R
Recursive case: fib(n) = fib(n-1) + fib(n-2) " v6 p2 F+ p( h5 Z# {* @9 Z' @5 A5 \5 d
python / W1 A1 v7 F; ~+ Z& i: J7 G' y: L R9 X9 V5 ~/ C5 n. P
D: Y. @, F9 edef fibonacci(n):; L& _0 Q4 }7 i0 X: ]
# Base cases - H) u" g( B- |6 ~3 K7 l if n == 0: # _8 d# O! ] H! @+ W return 0 . m8 Z; [- ` E1 ^ elif n == 1:! X- X! n V& f4 r, e
return 1 ) O/ ~5 k" y, ?; i7 G% V # Recursive case# y Y9 I: [9 W7 m
else: " u3 m! b- X4 H9 D( |6 @- P return fibonacci(n - 1) + fibonacci(n - 2) 7 d5 h7 u: i1 |* C0 d1 h K: a9 I 6 `4 R: o- D ~# Example usage; B1 E3 F' X( A7 u9 _, _0 y
print(fibonacci(6)) # Output: 8 9 P+ z/ ?3 T0 z7 x9 }! O' ]$ l 6 K {4 D* J E' g9 p- Q$ f0 gTail Recursion5 Z. P; U' t; R- n3 X8 Y
0 n: M) d* i$ C4 zTail recursion is a special case of recursion where the recursive call is the last operation in the function. Some programming languages optimize tail-recursive functions to avoid stack overflow, but not all languages (e.g., Python does not optimize tail recursion). + H7 I* }4 f0 B6 r7 w. q, n8 n; Y' _
In summary, recursion is a fundamental concept in programming that allows you to solve problems by breaking them into smaller, self-similar subproblems. It’s important to define a base case to avoid infinite recursion and to understand the trade-offs between recursion and iteration.作者: nanimarcus 时间: 2025-2-2 00:47
我还让Deepseek 给我讲讲Linux Kernel Driver 现在的开发流程,让一个老同志复习复习,快忘光了。