. ~" Z( w d+ X% y! J4 @ 关键要素; j. K' Y1 `% U) @+ K
1. **基线条件(Base Case)** 8 w. |" l8 L1 A( [- X/ Z2 d P - 递归终止的条件,防止无限循环# W3 s N; }' ]. b6 y5 d( O: \6 j
- 例如:计算阶乘时 n == 0 或 n == 1 时返回 1 - v' P/ E# A0 n1 @9 G7 D - D }8 t$ }3 }) M5 K9 \! j$ G2. **递归条件(Recursive Case)** - @4 X4 R4 J3 N; Z3 y' Z3 Z - 将原问题分解为更小的子问题 & t% s9 D; Y3 [5 N( ]# F - 例如:n! = n × (n-1)!! E) ~' E7 r$ z* N6 h2 k# h
, K9 l* c0 Y% I, C8 I( Q) t e
经典示例:计算阶乘 , R2 f' L! G, d4 tpython. K2 Y% |7 U3 B8 ^8 v
def factorial(n): ' h3 ?0 F [" @, ` if n == 0: # 基线条件 - N' G; Z. M4 o1 J4 ~" T return 1 2 M. d) T5 ?6 d; c else: # 递归条件4 w0 D& j! s8 h, _: }
return n * factorial(n-1); \2 E N z6 F7 K* P7 j, z/ t2 ^
执行过程(以计算 3! 为例):0 R4 O9 u9 }4 Y0 E6 C2 W3 q
factorial(3) ) P' X ^! |* X0 D5 t3 * factorial(2) 9 z) a6 e* W; X3 * (2 * factorial(1)) 3 q+ Z p6 S9 Y: {2 E3 * (2 * (1 * factorial(0))) 1 c* L4 R$ S+ B* Q* v# {3 * (2 * (1 * 1)) = 6 " Q) y: ~5 Z( d2 }' Q% ` V/ U/ K( i
递归思维要点 2 n4 |0 f* L4 P1. **信任递归**:假设子问题已经解决,专注当前层逻辑0 z: P$ m! p4 R% e& E, w
2. **栈结构**:每次调用都会创建新的栈帧(内存空间) % J/ C- U! Y& O1 t: b1 R7 E8 k% v" r& F3. **递推过程**:不断向下分解问题(递) 7 }3 |+ a) L) u) N& m ?; ]& z4. **回溯过程**:组合子问题结果返回(归)- e U- s5 u; Q$ x7 r3 ?
% v. Y1 I' E; Q1 _8 t' y' |, ? 注意事项9 n! y" L1 J. ^+ B) o1 n
必须要有终止条件/ R. v+ D1 _) V: M3 L$ T
递归深度过大可能导致栈溢出(Python默认递归深度约1000层) L3 i$ t9 y" H- s" T) F' _
某些问题用递归更直观(如树遍历),但效率可能不如迭代' g q* Z' ]! v# S' g% x/ ~
尾递归优化可以提升效率(但Python不支持) ; ?1 m6 z8 E+ I7 P% v8 p, R0 d; z. B5 u5 J6 ]7 `5 `
递归 vs 迭代9 G' B/ R+ c! U6 b
| | 递归 | 迭代 | # E4 {- w0 B/ c% u. V7 a|----------|-----------------------------|------------------| * ^) |' h; T: z2 `$ B; s3 X$ p| 实现方式 | 函数自调用 | 循环结构 |$ l% \& ^/ h2 ~9 h
| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 | * J* M9 z( A5 |$ @: d6 A- ]| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 |# F& ^2 c# Y1 C# m2 l0 l: f. O
| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 |! p" Y5 V6 i# P# k7 P7 \
9 t; X* z. A6 [7 J. I, Q
经典递归应用场景! n, {( L3 j" E' ?" y4 c9 {* a
1. 文件系统遍历(目录树结构) # E! G" l. U% q, ^2. 快速排序/归并排序算法 3 r4 Y. ]9 P1 R3. 汉诺塔问题 & j, J; [; e1 z6 |# F) b0 n% ]4. 二叉树遍历(前序/中序/后序)1 k, [. |9 a: `! @- x N3 M2 Y
5. 生成所有可能的组合(回溯算法)2 @! m# D% x* m2 k4 s7 W: Z
5 H% @# ?9 m z% \: _, K试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒,! h+ j* x" S6 L1 M
我推理机的核心算法应该是二叉树遍历的变种。' j1 t2 k* N3 V, D$ ?
另外知识系统的推理机搜索深度(递归深度)并不长,没有超过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: 4 {5 D9 i( p. t G! n4 gKey Idea of Recursion! _- c6 S7 R' v; Y; v. ~3 P- ~
% y. h3 q- Y4 u1 m ], Q& Q
A recursive function solves a problem by: - q' w& _/ n/ v* E% @% ^( ^9 _8 c3 b6 j7 j# c
Breaking the problem into smaller instances of the same problem./ ]( x% a) J; o) W! \; O
/ c% W0 t% y$ K2 T0 y6 _ e Solving the smallest instance directly (base case).( [6 |6 X5 ?5 {+ O
8 C; F; N/ C$ |7 X# F Combining the results of smaller instances to solve the larger problem.+ B5 P k2 R" {; a! y9 N& h. S, _
% A' {8 h4 E7 f/ L" i* ~8 ?
Components of a Recursive Function & B8 X" T* g0 \" L) b8 F8 I . J! W( u' e5 u6 U% s) y Base Case: . w9 D% D. u1 V: y1 ` 6 e6 P- a. y+ E* r! m This is the simplest, smallest instance of the problem that can be solved directly without further recursion.- M3 B1 o. B$ J* `9 N8 _
& B: g9 y2 i! O7 U/ H
It acts as the stopping condition to prevent infinite recursion.; s- W0 b/ r/ P8 R j* Z4 d
+ g! k' _+ F/ K: m8 b/ F7 M+ e Example: In calculating the factorial of a number, the base case is factorial(0) = 1.' s1 q& B5 \4 ]: ]- q
5 }9 a" i1 E# h0 s( \
Recursive Case:: y! y" l; J7 _4 W0 i. u2 I) a
7 i% v& f/ ]2 S' D6 d1 r# h
This is where the function calls itself with a smaller or simpler version of the problem.% g! F, ^; ~4 G( l8 I8 ]2 y
. v( w y7 H% Z; U1 X
Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1)./ n6 e! T9 B3 N' }, W
4 v3 f! G: Z% t" ?
Example: Factorial Calculation9 }+ n; {! K0 E
- @3 K Y8 l. P7 i* zThe 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:! l$ A$ i, J. i' j9 h( u
9 W0 l; ?: ]% E, f2 w/ B2 F Base case: 0! = 1 # K \' a" f; Z1 O1 R: q# A: k; w9 U* i, d
Recursive case: n! = n * (n-1)! 0 e* r6 ^1 A; K }0 P4 x' H1 j. A0 ?( h$ a7 N
Here’s how it looks in code (Python):0 V' @9 w4 i$ z$ c* t! `: p
python , ~8 C$ M: \. ?" o. r , J) f/ [: h, m1 t) g 9 O/ y$ y9 }/ \1 J" ?6 c5 `def factorial(n):# I( f% b2 J. K; V: {" D+ A5 l A
# Base case " T# }/ p# Q* m+ n, H# P if n == 0: $ I( O# Y2 N C+ l. ]; p6 I return 1 $ g, @+ k, W" f1 x+ c # Recursive case0 |0 n P8 m% v' v' l+ k
else: $ \- i/ I" V6 g8 I! M return n * factorial(n - 1)8 Z0 s$ p) ^4 D, h% V* k* }5 v
: Q8 K6 d; o8 o- {# Example usage- m+ Y8 Z% c _4 E& D$ T9 N- X) {
print(factorial(5)) # Output: 120 , o) {: k6 ~! [ / J- J8 e3 s1 d# J" g1 pHow Recursion Works4 w8 h5 y* S. m: V( D# \
( s1 ^1 S9 w( q, f! a9 Q+ ^' g
The function keeps calling itself with smaller inputs until it reaches the base case. g0 }$ c: _& `5 I3 m$ L) a
/ U0 d& J' v# D, D4 l2 O' Z: O
Once the base case is reached, the function starts returning values back up the call stack. : z. |$ v( R% V. b# u4 X8 M2 ^6 q5 F8 b/ A' j- z' ^
These returned values are combined to produce the final result. / l o: R" w' j/ q! L, E) i8 |& C9 b% u0 C
For factorial(5): 6 u8 c( A8 v! T: o0 Q/ Z D; z' h 1 {: W% g- U6 C; C: ?: O7 q) Y) k! W
factorial(5) = 5 * factorial(4) 6 ]! ?6 k5 b4 x6 ^+ pfactorial(4) = 4 * factorial(3)5 D) j' h" N3 z5 ?. g2 o+ P& l, \
factorial(3) = 3 * factorial(2)+ |" u: o' X5 _( H8 ~' O
factorial(2) = 2 * factorial(1) $ o8 o' _6 J8 @' v, B! Xfactorial(1) = 1 * factorial(0)! Q. `. q E( w2 Y: y F& E
factorial(0) = 1 # Base case0 Y" G6 ? s. n! H+ F4 B3 a' v8 L
$ ^8 n. u! z* j U9 ?1 zAdvantages of Recursion / a/ J# ^! z! W 5 {' N" a% a0 a 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).) _: V: Y4 n5 n' g
+ h, R; Z& {+ G. r, R
Readability: Recursive code can be more readable and concise compared to iterative solutions. 1 f! X& x! y# z1 p* `& J. x/ j6 o& V7 F# x* |* [6 n+ T t( P5 m
Disadvantages of Recursion' |* M3 {: H P$ P/ E+ C
: x: h2 A$ A1 |: B2 H9 V/ C: K& D
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.. w) f/ L- W& \0 l
. ?. M$ d& _1 z
Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization).6 C `$ Z) Z! O
, J, h, w# M6 x. C5 N7 M5 gWhen to Use Recursion & L- G- r# i) ]* e. V- a; h ) o2 ^* i2 y+ ]! X1 S Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort). ; F* _5 ?* ^! O7 X" X. {. w' ^, m: S ' m* \/ I" q* U0 ? Problems with a clear base case and recursive case.# `# |, \; b2 R7 j$ F% Q
A. U" U( S7 D& ~7 ?
Example: Fibonacci Sequence5 t( k2 E9 K& `$ ^& l! o3 F- W
1 M$ ]2 h& G+ t* E! GThe Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones: ! m' M* G( v2 |. u" X; ^ 6 E2 l6 a: e8 P5 I8 j3 Y Base case: fib(0) = 0, fib(1) = 19 _% R7 I/ w) [6 ]
8 R$ f( m! W6 O8 k
Recursive case: fib(n) = fib(n-1) + fib(n-2) H1 {$ R, x* H R" c+ t3 ?, e0 [2 v9 U F% s/ F1 ^
python 9 @" j& L! U0 G * ?) Q2 U- C0 M# _8 Y; v9 j6 A0 b Y+ `- H
def fibonacci(n):: {7 V+ u; o& ]& w! t: {1 \
# Base cases % E: o- Q) P! E) I' i9 l if n == 0:9 D/ g) L3 d3 l* f
return 0( b J# U" ?4 n) l/ O8 k X, n+ v
elif n == 1: 2 @1 n+ |4 ~3 L N4 e; n% R8 U return 1& A) O T' b% h" I L( Q) y
# Recursive case 4 m4 J) v/ u; X+ t else: 8 g0 r6 B0 Q9 l, _' P5 B return fibonacci(n - 1) + fibonacci(n - 2). t) p1 C7 e {
+ S# K: ~* m' N7 F& Q: V f# Example usage 2 |1 b- L7 B0 M- Y. F8 A; Hprint(fibonacci(6)) # Output: 8 * b- |# F, X% r) |( J3 h9 X! }8 ]2 B# @ d- f L U' V% E, o; Q
Tail Recursion + p5 O$ A }& g3 y k3 T9 i1 f, u' H e XTail 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).4 r5 x6 c3 r" H( i9 Y9 z
9 g' S1 `% {% t' n6 K% f9 A
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 现在的开发流程,让一个老同志复习复习,快忘光了。