! s5 [5 ]! x1 J1 \* g8 ~解释的不错 " G2 Q& _; q w& ]6 V ; |5 e8 ` I, u递归是一种通过将问题分解为更小的同类子问题来解决问题的方法。它的核心思想是:**函数直接或间接地调用自身**,直到满足终止条件。 6 i0 u( d( @! i; L ( {4 E) K4 p# D8 M( ` 关键要素 % @4 D. O. o0 H3 i1. **基线条件(Base Case)**& u# e4 j% d |; \4 _
- 递归终止的条件,防止无限循环 0 N9 g' `3 g& Y: H - 例如:计算阶乘时 n == 0 或 n == 1 时返回 13 k# Z8 d; H8 e6 x: H
$ o& R6 P, Z- x% J2. **递归条件(Recursive Case)** . \- A2 L' c6 S, N - 将原问题分解为更小的子问题 ; R r6 B' u3 c6 H! s. m9 u2 H - 例如:n! = n × (n-1)! 5 Z( U, w9 d5 D- s % q" p4 B/ A" D! c4 U; d 经典示例:计算阶乘 1 h- U/ A) v% ]2 z3 Jpython ( S' p1 Y* ^, a( Cdef factorial(n): 4 t0 e" Z+ d$ T0 F# P! @/ m if n == 0: # 基线条件 Y ^$ s% a0 J1 N, J7 `
return 1 9 k4 p8 }5 W( l% w# L else: # 递归条件 " S1 V0 A2 A T" W! x# X( T& S3 e return n * factorial(n-1) z$ M% A% m4 o0 v2 N' b; i
执行过程(以计算 3! 为例): * X3 U9 c S& ofactorial(3) " ~, n. o, g0 G2 h3 * factorial(2) & q7 C5 a& j0 V w0 S3 * (2 * factorial(1)) % W' d% e% ]: J6 o+ r e9 e3 * (2 * (1 * factorial(0))) / r: {& I6 M" g4 H+ }. z3 * (2 * (1 * 1)) = 6 7 J- ^5 M/ S+ F7 |! u0 _. ^% z ) i. \9 ^5 K+ _7 }: ^/ b* U1 i2 U 递归思维要点3 |# J! p% N* A6 U2 j9 ]$ p
1. **信任递归**:假设子问题已经解决,专注当前层逻辑 4 u1 L Y3 u) D7 Y' k2 X: h2. **栈结构**:每次调用都会创建新的栈帧(内存空间)3 @4 N5 P, s: q' ~! N+ J
3. **递推过程**:不断向下分解问题(递) ` r9 S6 q' ~# x6 c$ U4. **回溯过程**:组合子问题结果返回(归) & @( K: D2 x! v& n0 |. E - j: P w8 n1 r8 C" n2 L4 r 注意事项. s& P5 d6 E+ c) p, ?6 D
必须要有终止条件 0 s7 T) F# I+ ~" O! j ?: f递归深度过大可能导致栈溢出(Python默认递归深度约1000层)( P s2 W- d: c/ x
某些问题用递归更直观(如树遍历),但效率可能不如迭代 ! V1 P1 X# U/ p尾递归优化可以提升效率(但Python不支持)( O5 U! J* a5 f3 k- c
. @/ I6 n; w4 b- [$ C- x 递归 vs 迭代 ( p$ _8 ^ ?& C8 r3 G. y| | 递归 | 迭代 |4 _! @1 X0 t/ b* P' |
|----------|-----------------------------|------------------| ) @$ U: w. H* y6 B# Z" h9 ~2 T| 实现方式 | 函数自调用 | 循环结构 |& [( \: q1 g% j2 d& k/ ]
| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 | ; Y* J( |1 D( P1 d| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 | $ H" R) m0 k" [; D5 `| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 | & S5 Q& }8 m# R2 m0 z( @' R ( n+ [( q+ z. f4 v {% k; n 经典递归应用场景 8 w9 m3 y' [" o( y! B+ M2 M9 r1. 文件系统遍历(目录树结构)+ k5 k- S! P2 y. N
2. 快速排序/归并排序算法! h* D, ^. o O6 t W# P: d% x6 F9 A: M- X2 u
3. 汉诺塔问题+ p5 j# A- L3 i& |# I
4. 二叉树遍历(前序/中序/后序)8 U A+ ~5 G. W+ h+ I: H
5. 生成所有可能的组合(回溯算法) / {, T" _0 e2 j' k: A' r/ E r1 W" P4 D
试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒,, y$ D7 K+ P: h9 l8 ?
我推理机的核心算法应该是二叉树遍历的变种。: L0 z! t& \& f1 Q6 V6 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: ' ?6 |& x: M5 H/ \9 B& W9 V# p) AKey Idea of Recursion 8 m! i1 o( s$ q4 s N4 H. s' r! D+ I# V! A4 p( H7 j
A recursive function solves a problem by: 7 G+ r& _2 M& s d) J( P/ x y7 u3 \: L9 \& k
Breaking the problem into smaller instances of the same problem. % A4 w. ?- x6 u0 Z5 q5 p5 v9 `! a. |- j
Solving the smallest instance directly (base case). 8 j( f$ ~) n1 X6 K& b7 ?" } 9 @$ b; ^9 v% Q# p7 e) I8 p. k Combining the results of smaller instances to solve the larger problem. & \9 t1 C/ ]; \$ Y0 G1 J$ V& I- T, c" d% B
Components of a Recursive Function2 q6 Y- j& p& {8 }
% N# }' T% I, b* g) M& J
Base Case:+ c+ C9 E3 o" P* E- k
& m9 R i% Z+ q3 G4 D" c
This is the simplest, smallest instance of the problem that can be solved directly without further recursion. & A% p4 `2 ^( v3 P / i* m3 s' y8 W: E/ }- w- L It acts as the stopping condition to prevent infinite recursion. ! c, @0 @$ R9 a; V, I0 K 8 [8 ?! k) \1 u4 o Example: In calculating the factorial of a number, the base case is factorial(0) = 1.& c6 `& v: ~. |& X, x5 l- Z0 k
! p& H4 j1 P ?3 q M( o7 N0 J1 ~ Recursive Case:! X- R# [% v1 |* a1 x$ _3 P [' s
5 ~/ S) o8 R7 a
This is where the function calls itself with a smaller or simpler version of the problem.9 i( z5 u- h; T @$ M5 T" M
, x$ U+ h+ O; {
Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1). . |; }8 n2 \& B/ g9 H$ ^5 }/ f* k; L& f& ], e1 v
Example: Factorial Calculation % G) h6 n- p$ u1 F8 Y" U+ ^9 D. O9 u
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:! L }6 E7 e8 q8 B6 v/ w
: O1 C; `9 c; a Base case: 0! = 1: i0 H6 S- S) g `
% w6 A! Z( E- I: ?9 ^- Q/ _
Recursive case: n! = n * (n-1)!4 k) v# ] t! }# U0 F
9 z! j; R/ `! q' U9 m" ` ^Here’s how it looks in code (Python):! U5 @3 b9 z5 ^) K3 D
python/ \' e$ c, c6 ?. E5 \( o& q9 q) D! M
$ q8 z: l6 D+ P# O! {/ R& r& t- K& R- B* Z6 l
def factorial(n):* }4 _" |4 B( u' m$ d, {0 E/ t( U
# Base case ( o9 O9 Y" M0 R8 G if n == 0: ) E" c" z% F2 L return 1$ G+ l0 B+ E' t* A, \0 q. n- g
# Recursive case ( w! V$ f, F$ m- b" w/ A" I% P else: 2 B1 p$ g, F. V! c% { return n * factorial(n - 1) K6 e; m2 H( k( ?3 [+ W, m
" }1 r7 k9 S# x6 v$ r+ q5 S# Example usage! F( S H6 `7 M+ j2 g: Q' Q
print(factorial(5)) # Output: 120 4 \, _# l; c$ R : R) W/ G( k ]" t+ w* `' WHow Recursion Works" X' b! W/ H- t F7 w
4 t/ L& Y) \/ w5 |7 i; H7 Y: G
The function keeps calling itself with smaller inputs until it reaches the base case. K7 \8 ?1 g. k, J# p4 U+ T" @5 C& k( q6 s6 [1 W2 A
Once the base case is reached, the function starts returning values back up the call stack.* M* e& [! N1 h+ v9 z% e
. L6 ]) p3 t8 P7 X' g* T These returned values are combined to produce the final result.7 O* D+ x# G+ u$ I! A2 ^
/ s- B* s' q3 I3 w. |For factorial(5): 5 Q( b& g6 l' E) N5 l$ T$ g& n2 d. d* r! e& p3 q ~
5 W) N% z, Z. v7 C# i9 JAdvantages of Recursion ! U- u; p' Z* G2 O* M! M! g' T+ D" K5 P6 X! [$ q d5 {- f
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).6 H- l* X7 _% ^. |* `- e
4 N" ~& M4 C. g8 s+ z5 K% s3 G Readability: Recursive code can be more readable and concise compared to iterative solutions. ~. r, j! \! O+ @2 d/ c; D( p& m) @5 T( M; o! [
Disadvantages of Recursion8 i: R" y$ K: ]7 {
f# f0 F. t h( @2 w
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+ y" h5 I: r" ?" b( [5 Z! {& z. F) ]; N
Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization). 8 R" J5 V. ^. }, z. o7 y3 L9 X 6 n( r) ]% T/ {6 u4 Z/ xWhen to Use Recursion " i7 {$ I& V8 w+ a& o) j9 ~" ^, o$ i( v+ s
Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort).1 k+ W9 |9 Z" q2 F! r
1 I5 K& t# |) D' j
Problems with a clear base case and recursive case.; t: O6 B6 D# N' X8 z
4 K& z, s3 O4 O; f. [, s9 D7 A8 iExample: Fibonacci Sequence 1 {! y; o1 v/ a0 T4 J! W + m0 I" j7 l' jThe Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones:/ K4 p8 ]( t' Y$ b! ?# l8 E x
7 \5 V' e) U6 |4 `- G Base case: fib(0) = 0, fib(1) = 1+ x3 u7 x$ t9 R2 y' {4 l7 Y
K4 o- r* u9 L% m6 }) k5 o Recursive case: fib(n) = fib(n-1) + fib(n-2)# K) ^( q1 J0 l& R( `( [, S* d
1 D; i9 x' d) P& H
python# u$ n8 |1 r2 l# j2 y
& a# I; y: Q) g: @) ?# l. w& j
! Z: Y- E; t$ ^1 R" h, V
def fibonacci(n): # F0 U* S6 i1 U # Base cases & O! N" H5 u% Q, k9 e if n == 0: ; O! d) I( l0 f* ]) o8 m return 0$ P2 a! z4 M6 A* N
elif n == 1:3 }; a$ Q, u& @* D4 A; o
return 1: ~/ x- y4 Z% s4 K3 w, Y
# Recursive case * L3 _: p6 x. z, t* B/ x! j) u' y else:# I1 g4 y/ p" j: ~
return fibonacci(n - 1) + fibonacci(n - 2) $ B/ _- h+ c) ^9 Y( @ R; g- E% Q1 H, s. N; c& l! j" A2 l, x
# Example usage # K) _+ y1 {+ n5 H! Z2 M* mprint(fibonacci(6)) # Output: 8 8 l: i0 Q f5 x ! E! D+ f% C mTail Recursion 9 r* ]7 K; Z: H- O2 N. s) |' K0 |: J7 k; T
Tail 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).2 G7 q6 @9 {1 b1 g0 Q0 C
, U8 e: V- v/ y4 B/ ?
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 现在的开发流程,让一个老同志复习复习,快忘光了。