! I6 ~0 S _( g2 |. @ 注意事项 2 c. u) e) C1 n# A. H! U! b必须要有终止条件 ; t) r3 t0 R/ ^( W递归深度过大可能导致栈溢出(Python默认递归深度约1000层)9 v7 Z+ a0 A# q% P% c4 B% l1 a: _" B
某些问题用递归更直观(如树遍历),但效率可能不如迭代8 _0 Q) j* w N/ I' {1 A
尾递归优化可以提升效率(但Python不支持)( v) O5 |. R- b# f
% n) t$ `( ^* V% Q* a 递归 vs 迭代 $ I& Q/ N& q( O8 y$ T% E# t| | 递归 | 迭代 | $ x2 n1 k0 K9 u" B* z2 n* [+ p- X% A|----------|-----------------------------|------------------|3 Z$ H0 }( L& n( S: P3 w. ^
| 实现方式 | 函数自调用 | 循环结构 | ; Q3 |3 @# k" v8 G| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 |( r/ Q, @% H% Z6 G' ~% A
| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 | 6 z; k4 ~! I6 E4 T$ j* ~( \ V| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 |1 b# A. i8 F) k: Q( P( p% E, C/ S
+ I. v1 e6 N: e
经典递归应用场景 # Z% Y5 m0 p' x1. 文件系统遍历(目录树结构)* ^% X- o) f+ ^5 p/ s4 M
2. 快速排序/归并排序算法 ) A% L. Z; m: V3. 汉诺塔问题 3 v% x$ Y5 p$ y# S' |& c4. 二叉树遍历(前序/中序/后序) : u) z. L! [: F5. 生成所有可能的组合(回溯算法) 9 }. f8 n2 Y1 Q2 X8 D. W 1 R0 H; t" W; i试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒,$ |9 W: A. Q @3 n( M* D
我推理机的核心算法应该是二叉树遍历的变种。 7 R: g( r3 V" O- |8 i7 V另外知识系统的推理机搜索深度(递归深度)并不长,没有超过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 p! i) R0 c. F o- EKey Idea of Recursion% k$ l8 {) q$ C3 k* d: X8 v0 j) R0 X" J, G
% J0 x; J) u+ e5 L$ ~8 VA recursive function solves a problem by: 8 g* _( w' W+ W0 v* D8 e4 F4 `2 [, X' [8 W$ A( p& b6 S
Breaking the problem into smaller instances of the same problem.9 v- s B9 h1 L/ Y4 O& [2 w
' t! M$ q. {: ^: U! u( { Solving the smallest instance directly (base case). * H) W0 w$ @/ Q* j. o1 J 8 m! w. r2 _- ]+ p Combining the results of smaller instances to solve the larger problem. a* ^* J. g. W& V7 {+ i, p
3 \$ t$ D$ T: W! a" }2 j
Components of a Recursive Function' ?1 R& }5 {' L
, b4 m/ _8 ?5 L% n8 a' v& Q
Base Case: 1 }# B- U& \% {) `# e$ B' l: h, e
This is the simplest, smallest instance of the problem that can be solved directly without further recursion. 2 m4 G( N. w: Z' D2 u1 H- j - h% \9 ?# T" c2 ^5 S It acts as the stopping condition to prevent infinite recursion. 9 E: }( R( N1 H/ N. |8 |: Q, \! \$ K l' V
Example: In calculating the factorial of a number, the base case is factorial(0) = 1. 1 |0 l: f; s- v( h2 O( b/ S- K 9 Q, p+ `( l: l" H3 P0 b2 d6 }3 N Recursive Case: 1 y2 E1 i; W! J g- T ' v* W- m7 ~# ~! W0 }7 i! y3 B This is where the function calls itself with a smaller or simpler version of the problem. : U" N! m( D8 s+ b- ?9 D$ r: l- D
Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1). q, `2 R. N1 N' Y" G! h' S
- K! w) M" E* ?% U4 k9 BExample: Factorial Calculation 3 q# C9 @; l. m8 ] 2 S, m/ d8 U& d6 \- \ ]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:& M0 G( r8 X p; ?$ r7 Q0 ^0 e+ s
4 }) u2 o9 G; u9 A7 Y) K- Q- `' }1 I
Base case: 0! = 1 p& J8 {6 d, b0 S+ O0 B& E0 h 0 j; q) l# [$ d2 C; y, r3 V: d Recursive case: n! = n * (n-1)!1 j7 y9 a* B7 Q$ T; p, \
8 o/ K$ U8 k' @, u
Here’s how it looks in code (Python): 2 S3 x& W" e/ ^python % D4 _' @9 M. f6 u/ z7 k7 x$ z8 [6 P7 z, [3 r/ F
9 V9 s2 O# { q! x3 o+ o: m
def factorial(n):* ?4 ^: o* H2 Y
# Base case! `) `2 L- q8 [. L8 d
if n == 0:& Q. `& ?' @0 l/ d7 K: z# M
return 1 $ J& n( G! t: p7 b% t: u) O5 x$ _ # Recursive case ( N2 e; K* _& W* A- _1 b else: ! i- T; a3 K) K return n * factorial(n - 1)- Z! U0 J5 X1 o' k6 }9 X* R1 V$ J1 U
8 T* A! H/ g3 ^- q( Z# Example usage 3 N( n6 ]! n" h( c, F5 Q) Eprint(factorial(5)) # Output: 120' K6 u, Z4 L, X/ n3 t& s: R" D
) e7 |& ^# [# h' p
How Recursion Works2 ~& [ W% }! }3 i* [4 ?& M
( j7 Y1 w# G2 n8 [8 i
The function keeps calling itself with smaller inputs until it reaches the base case. a0 s% |; O) A, s. U8 M& {- R9 b" h
Once the base case is reached, the function starts returning values back up the call stack. - l: g3 L; j" \# g) k! o7 F$ d1 K, z8 n/ X
These returned values are combined to produce the final result. 8 u' }3 E8 g6 d$ E/ G& o- K# T6 W1 ?7 K' x% ]% o3 f
For factorial(5): % W# S) N3 O( f; G L; \. F2 X9 E) |4 n* q( r' N( [
$ v* h, ~0 h$ y" G+ P& b% Jfactorial(5) = 5 * factorial(4) 1 n) P$ D- m+ D) e; T( w" ~" X; W: Jfactorial(4) = 4 * factorial(3)3 A/ l0 @* d# f w
factorial(3) = 3 * factorial(2) 5 J. {' D' f3 }- `7 Nfactorial(2) = 2 * factorial(1)3 L6 T8 @5 T) ] u1 }
factorial(1) = 1 * factorial(0)* ~# U: q4 h- L* z. ]% Q+ L J: W
factorial(0) = 1 # Base case0 |( ?' _1 r) a2 A1 o( A
2 d5 ^9 v# m5 {* b
Then, the results are combined:+ T/ T" |9 S1 t' {! z
4 h1 e! u/ z, g ?3 m. B! [
" N% y9 X5 J( B2 M+ u) _5 O5 P
factorial(1) = 1 * 1 = 10 H3 f+ U7 \9 `$ {& V" F c3 v
factorial(2) = 2 * 1 = 2) L1 [! x6 Q0 q# J
factorial(3) = 3 * 2 = 6: A6 P W+ ^- p4 {" W0 p: B
factorial(4) = 4 * 6 = 24 : T1 ^; C G0 Y- \8 [5 W, j+ [factorial(5) = 5 * 24 = 120; g4 I) D; N/ C- E
- ]& Z) x& t+ D6 z! S+ `/ S
Advantages of Recursion % H( o& g7 u4 Q: c$ f7 N3 B% H0 Z. t0 e) r9 X3 P, ~3 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). ! o% v" q# e n7 k' Z0 J/ l+ E4 [$ u2 H& `0 l: u& s
Readability: Recursive code can be more readable and concise compared to iterative solutions.- ]% s. U# c2 Y% X
" V3 ?0 `3 q ?6 H- E6 w. EDisadvantages of Recursion1 \/ E) O* T- U/ S( R- x+ d
: x. u% B3 r: ~0 ^# M 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.5 P7 k3 O# }9 \. Y2 c1 `
! _* h& d `. {- N+ S$ s; {4 I
Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization)., @! S; K0 R. c: z( f
6 Q1 a6 ?' \4 jWhen to Use Recursion8 M9 c# m; l3 d
" d4 F2 ~- r) l4 G; i* A' ?2 {1 T ?: ?
Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort).# |* ?1 U6 r* a7 i
+ n" i( _3 j) ^. V Problems with a clear base case and recursive case. ( H3 p) j' S! E: k6 P7 R & G- u, G4 K0 {Example: Fibonacci Sequence! ^7 z1 q W9 V% c
7 C3 B* w1 @5 n3 a0 j5 n. eThe Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones:9 @: V, n3 ^2 |1 n. w7 ]
; T9 k# M, W. U
Base case: fib(0) = 0, fib(1) = 1/ [/ p& X1 q; `8 D
0 [ O- N$ E( |; _, W n' B Recursive case: fib(n) = fib(n-1) + fib(n-2) ' h- |, \3 R5 d4 k: X" c$ U2 x " J) s, r# p {python4 F/ r/ D3 T/ p) G& @! E
6 R9 c5 X" v5 i& c% y6 b 0 |' h8 O7 A5 v. q) udef fibonacci(n): + ~: ^4 |, I: d2 s # Base cases 2 l7 ]+ W/ A( N+ d5 J/ X if n == 0: / J+ } }9 D: p8 [8 ^ return 06 J4 s0 Q' ~/ g; }
elif n == 1: 0 n8 J0 h( [6 Z return 1+ y& P5 K* J2 U2 A: m" C o
# Recursive case ! u7 M2 c5 j# G4 k* M else:* Z D( S/ k# o8 T* w' l% @* X
return fibonacci(n - 1) + fibonacci(n - 2) + K+ q8 T: b/ B* d t7 t4 Y# g# Q. U( w+ s3 x
# Example usage; f) R: z7 N( W" j- `/ U
print(fibonacci(6)) # Output: 8 ; R0 d% e) w, C8 U# N2 a- W, ^* t/ r8 g+ i0 o8 b: k0 d
Tail Recursion+ s4 U4 @; @3 c+ R9 j. s
/ w, v& u$ X" ]
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). 9 G# U8 l, b6 e* v8 ^ ; W& T3 j8 _6 k6 D6 ?: \3 wIn 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 现在的开发流程,让一个老同志复习复习,快忘光了。