% m7 G( ?( [' q解释的不错 5 V" j' k5 J' S( M! |* C/ H3 Z. o' H
递归是一种通过将问题分解为更小的同类子问题来解决问题的方法。它的核心思想是:**函数直接或间接地调用自身**,直到满足终止条件。 1 J6 d. w+ ]6 |1 _/ x6 M: M$ R , I" q5 F" x2 x% Q0 Q 关键要素; E: |& ^1 I; U! F/ |, {
1. **基线条件(Base Case)** / x( I) w# ?0 E! @* O - 递归终止的条件,防止无限循环 * d2 \' {5 g* N ^7 z0 g - 例如:计算阶乘时 n == 0 或 n == 1 时返回 1 % F9 K; e% C) Z# K : @3 e2 ]( X/ m* V) h2. **递归条件(Recursive Case)** 1 ?/ Z% m- T# p- q( C$ O O - 将原问题分解为更小的子问题 1 d4 N9 @% C6 m- V0 y X5 z - 例如:n! = n × (n-1)!- l6 \) W7 J9 I! Z: r
* d* i, i$ }( S6 F. N
经典示例:计算阶乘 : J+ U- ^1 s* B) h- s: a- z6 H) {python 6 h, `! u- L* ]/ C9 j$ vdef factorial(n): + S) K" q% H& i2 l; v5 P8 P+ C if n == 0: # 基线条件 ; n- ?# ^6 T* P; i+ s. H return 1" w( V% n2 R8 a) b( J. y- t
else: # 递归条件1 ^ z. a9 M' v0 K
return n * factorial(n-1) ' D4 j7 R. c) P5 r: z: B I执行过程(以计算 3! 为例):6 `8 W; V5 o7 d: s9 e
factorial(3)* w1 ~# o# ?6 T
3 * factorial(2) 5 Z- x' K* g, |+ `, e3 * (2 * factorial(1))( A9 B# d& P8 a- n, s/ A
3 * (2 * (1 * factorial(0)))) b) e: ~. O% e9 {7 j
3 * (2 * (1 * 1)) = 6 ) S# i: m) q6 }$ S% ?5 A! T+ X) ^, e. @* y& G
递归思维要点 $ g0 V! d0 z4 ?7 Y5 Q. a4 t1. **信任递归**:假设子问题已经解决,专注当前层逻辑 ) C* H9 N% X- N" O* \; ?9 ]* M2. **栈结构**:每次调用都会创建新的栈帧(内存空间) : ^' r8 F3 d) q& ~7 i! C" i3 d3. **递推过程**:不断向下分解问题(递) # ^# c3 g+ c, G' m( R6 M, G2 ?4. **回溯过程**:组合子问题结果返回(归) & l i$ F! a* v$ B" I$ n + n6 D3 s5 n* n/ a6 k 注意事项( U4 F4 `5 o% m( o5 H% I
必须要有终止条件$ ?5 z) I4 r/ L& x: v1 F( f2 x
递归深度过大可能导致栈溢出(Python默认递归深度约1000层) ! Y) w/ l5 \5 A( v- ^1 D某些问题用递归更直观(如树遍历),但效率可能不如迭代 u/ J! ^& f+ e- S尾递归优化可以提升效率(但Python不支持) 5 j6 j) e) X( C1 \/ K# M/ Y5 I. X& Y [
递归 vs 迭代0 z Y: h2 i" a7 z
| | 递归 | 迭代 |, L6 |4 U3 M' t7 J, T1 ?6 ]) S2 ~
|----------|-----------------------------|------------------| 0 ?& _# ?: J4 ~+ h. @| 实现方式 | 函数自调用 | 循环结构 | 0 |0 z0 }7 H/ E6 T; D| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 | $ @. R: s+ P8 E6 }8 d' V& l: ?6 h| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 | 3 x# E- W) ^& R" ~5 X6 w6 e| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 | 5 Z: W0 m _# ~* _) O( W% p$ r& y7 d0 p; Q3 ]) C- Z3 X( q1 A7 d
经典递归应用场景) D ?, u$ D$ W8 ]
1. 文件系统遍历(目录树结构)' y9 z9 z' y% L* ?' N, ] |
2. 快速排序/归并排序算法 ' l5 ?6 k N, Z1 Q3. 汉诺塔问题2 F! |: j7 E$ j8 Y
4. 二叉树遍历(前序/中序/后序)7 W/ w' h' l3 U5 | Z6 M& v
5. 生成所有可能的组合(回溯算法) ) A- F# ]& u/ s& }- t' a5 ` P5 T& v& j( Z5 h4 g% B: w试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒, ! V) O0 N6 G( \ f6 v我推理机的核心算法应该是二叉树遍历的变种。 / K9 i5 Z" O* h" r& J! 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: 7 k3 x' O6 z2 \* mKey Idea of Recursion 2 A+ g$ A9 J9 d2 R( p8 q' n2 x }7 x1 B0 U
A recursive function solves a problem by: 1 q5 i- `. o! Z. o0 o4 D3 P2 ^ e8 d) @
Breaking the problem into smaller instances of the same problem.# T# G5 `/ Z$ i5 ^1 E+ f1 c1 `
- c/ g0 h5 h7 F+ r5 \. j6 O Solving the smallest instance directly (base case). 6 W6 R& o% {4 G c" f4 V3 @ ! T5 k. R+ u" a; A3 d Combining the results of smaller instances to solve the larger problem.7 j4 r' s* K9 f6 a6 a* }- E5 A% {
* Y2 {! t* T, s XComponents of a Recursive Function : v( a& S+ V) h2 |' `. g/ E7 Q' U( C3 t( E& C
Base Case:3 d; Q0 A# f. m# d& ] L
) L* j& |" G$ l" M/ B- ^
This is the simplest, smallest instance of the problem that can be solved directly without further recursion.- d7 L/ O# j% q8 h6 V, [
) o& `6 E; q# m9 u+ F+ s2 W It acts as the stopping condition to prevent infinite recursion.& A2 ?' |! \( O8 u* P
5 k* @! C) z( p0 b, L! H4 {' {% @
Example: In calculating the factorial of a number, the base case is factorial(0) = 1.. F# n: \7 }! m" l. D
8 O! F. m" [, U$ y# I' @
Recursive Case:, I, V! Z% A* F7 L$ S
- \* W& h Q7 d- v+ r8 m" J S
This is where the function calls itself with a smaller or simpler version of the problem. 1 |( [: o) g3 [: F% U4 w e * T2 g% E; S& c, `. t Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1)., N0 T) e; s, n) k6 @
4 [2 i+ i: T' E3 L+ i7 X6 bExample: Factorial Calculation 2 I" W* I4 n& Y& K& ]" r+ C5 z* d; s& A+ D4 b: c; T
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: - i; s0 n1 Z8 x: X8 |+ U6 Q: B' j9 s# z4 w3 x
Base case: 0! = 14 J6 `/ Z7 h+ F3 ?) X
( k+ r, |% y0 o# Y
Recursive case: n! = n * (n-1)!. K4 H! C+ l' l, M8 S2 ?
0 b4 j: w( Q6 ^* e/ OHere’s how it looks in code (Python):8 o; X$ e+ z# B. U; Z
python" k! ~& F+ ?/ r' k4 z
, P8 M* r6 G3 }. l/ i5 M& M4 p) L5 r% A% J, [
def factorial(n):9 h5 b1 }4 C. p7 h) L
# Base case 9 E; Z6 ?2 I# M if n == 0: ; t! O9 x; m' x- b return 1 3 Y2 x2 p7 f! \ # Recursive case + [) N; r8 a2 S7 m1 x( O, r else: 2 V7 M0 k8 O/ m$ i, g2 V& j* m ? return n * factorial(n - 1) ( W, x- J2 H) N & c4 T- @, o; h5 r& g* b7 x# Example usage/ O% G% f$ ]. a0 f2 X
print(factorial(5)) # Output: 1201 r8 F" A" [+ d+ G/ R! ^! |
. Y' T: `) p5 Y Q. W
How Recursion Works/ ]( I6 K& m4 h2 @$ ]! m' d3 K
, ]7 a1 D% I5 B8 j+ f4 K The function keeps calling itself with smaller inputs until it reaches the base case.7 W9 h" H/ P V5 K9 S$ `! D
. q5 @/ X+ b m2 V- F) B+ }) d' S
Once the base case is reached, the function starts returning values back up the call stack.. Q+ |/ s$ V% a5 z
. Y6 N8 O5 ~0 R These returned values are combined to produce the final result. : y1 V! g9 ]4 G/ `+ f. X- _) a- _' A& q! d
For factorial(5): 4 i' F1 Y) z- D2 y' e U3 k. w9 e! [0 A: z- t) }0 H5 }" _7 B
; s% i" N0 A7 A; M0 }/ q7 }: t7 mfactorial(5) = 5 * factorial(4)1 _) n# [! a' U4 y5 i% ?, W
factorial(4) = 4 * factorial(3). |% J! c7 g8 T E
factorial(3) = 3 * factorial(2) o* t- S' q' J' A/ Q, G5 x
factorial(2) = 2 * factorial(1)* m# L- L, m/ ~! ~
factorial(1) = 1 * factorial(0): s& [& p" y. T* s! B
factorial(0) = 1 # Base case' R0 L g2 I+ r! N
7 {8 P ?9 ]0 R2 g7 s7 I( I! fThen, the results are combined: 6 |7 a/ [/ p9 O' D# [; c9 a8 j! H, [* Z& G
1 j/ S; ^' T& G! x/ V6 [ 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). 4 X. a# y% v8 W: i' h( \) Q3 Z7 W ( J: H h" M" C0 i/ t- e7 \ Readability: Recursive code can be more readable and concise compared to iterative solutions. ! E$ n" `7 E4 c. Y, {! H 5 s% x3 ~' |8 B/ ]* u5 n) ~0 ^; b. ^Disadvantages of Recursion * O4 B# t& n+ |7 ?1 s1 s: C. b6 I3 D+ ?- 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.# A1 f0 F n. n0 G$ O( r1 K4 W+ `
8 S# j- r4 O2 {, o
Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization). 2 A3 T& ]$ R! b4 {5 e) g- [9 S: }( w 3 k4 L5 A: W/ n2 sWhen to Use Recursion * Y, c. |& e* a; x1 C5 @( l 9 J$ [0 i/ H; B1 m Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort). & R& y& C# a- Y" g1 P5 ~5 o # Y* B7 @$ k7 c: L7 t( V# e Problems with a clear base case and recursive case.* S8 x! S+ t8 Z
" T* l; S2 r* F3 R! I P; j# XExample: Fibonacci Sequence- k& i% t, `/ G6 K8 Y0 H
0 H) X/ \" a, E3 n1 w9 c: c
The Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones:0 l# j# A5 T1 n* I
5 J1 S3 n. ~9 I" w Base case: fib(0) = 0, fib(1) = 19 Z5 Y6 ?. E# s* a- r R
/ @5 Q" V% m4 Z9 @' q) g, d+ ?% Adef fibonacci(n): 5 P5 q6 p! U/ U$ n; l/ [" {9 V # Base cases 5 D/ ?9 p6 v: N! }" s' ^# T. Z B3 L if n == 0:% d" v8 Z* z3 g; |% G& _
return 00 r; A+ f) V. @/ ^
elif n == 1: " T. T- x7 J+ ^% f; ~ return 1 ; X9 R! {9 V" Q/ c/ G( N # Recursive case ; ~" V% N2 m! P, Y, B else:4 @+ V2 s" @7 \; m; k% [4 t
return fibonacci(n - 1) + fibonacci(n - 2)% S) d0 b( P4 ^7 h! |. s9 c+ d
5 _/ ?2 p! ~& ^: j" I3 z$ ?
# Example usage' ^# ~. M* n5 D0 A E. H' G, }0 v
print(fibonacci(6)) # Output: 8 8 ^9 @( B( j; ?* J' |% l 7 y0 q) m- r1 V; G# t4 C7 ZTail Recursion0 l% b$ h2 E& E! M
9 C& Z- @% \3 `7 e1 r" d/ sTail 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 r' ?: i8 [5 [: s
* y: l. |! F l( T3 v2 S6 H0 `# fIn 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 现在的开发流程,让一个老同志复习复习,快忘光了。