4 P5 {$ m6 I, A3 L7 I6 \" ]& C2. **递归条件(Recursive Case)**! t9 x1 q% Q' g* i3 e$ y
- 将原问题分解为更小的子问题 % e4 M9 g. u8 w6 d. u - 例如:n! = n × (n-1)!+ o+ |2 m* g0 o
$ A1 \9 _$ D3 U- Y 经典示例:计算阶乘 * H3 V' J& K; gpython & Z1 a, `+ D1 }& i9 ?def factorial(n):/ {3 O4 `, s. W
if n == 0: # 基线条件! c, n: ]3 A2 \+ @, y
return 10 e' Q: | ^' f5 ]9 N
else: # 递归条件; D2 Z( N) P* G- j6 x8 Q
return n * factorial(n-1) 7 {' U' v, f, T; y- R3 w执行过程(以计算 3! 为例): + `: f' l4 k# Nfactorial(3) " o1 C9 D; C7 `1 E- b3 * factorial(2)0 M2 k- e% M; O0 i% C4 K. n: r& u0 y
3 * (2 * factorial(1)) " M8 D- z. W+ ~2 u% N3 * (2 * (1 * factorial(0)))6 r# N2 ?+ g6 F- M
3 * (2 * (1 * 1)) = 6" n- m) M( T, g; E- h2 J: `1 I& E
8 S1 g1 _; ?7 t) t! k$ G
递归思维要点( G- y. ]5 w7 T D2 n0 n
1. **信任递归**:假设子问题已经解决,专注当前层逻辑 . A) l! m" B) ^8 B* i2. **栈结构**:每次调用都会创建新的栈帧(内存空间). l0 T/ |' f) R. m, [
3. **递推过程**:不断向下分解问题(递), h1 v |) j% M) J) a& ~) d
4. **回溯过程**:组合子问题结果返回(归)* \4 w) g3 t/ p4 ?8 S k
) o: _+ I0 G- ?- F4 M J2 V8 z 注意事项 1 c9 X8 {- ]+ A必须要有终止条件8 z; ]7 H$ M+ U( |' X' D: T' h
递归深度过大可能导致栈溢出(Python默认递归深度约1000层) 2 Y, ?1 O5 O) t# C6 ]6 W某些问题用递归更直观(如树遍历),但效率可能不如迭代 + Q" f! L4 |+ C2 y9 H& |8 z尾递归优化可以提升效率(但Python不支持) / V- l$ w# b/ A- b- y1 w' A% j$ |4 n8 r( W. ~4 \/ J
递归 vs 迭代 ; V' B6 {' j# Y% L) t, K| | 递归 | 迭代 | - E$ n* j5 B( U. i8 F|----------|-----------------------------|------------------|3 Q, N$ |& F0 N+ ^6 K$ k* T! u* u
| 实现方式 | 函数自调用 | 循环结构 | ! p5 Y3 b. K( L! S2 {$ u| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 | ) |4 w- v* W6 s/ ~| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 |* D# y$ V H$ b' X2 \
| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 |' o; U2 g1 w6 u% U4 C7 d
$ k) `8 z7 h$ t! q4 ~0 B
经典递归应用场景! f% l. H6 F& M7 {7 i# l
1. 文件系统遍历(目录树结构) * W. B; ~* ^9 N+ e7 K/ f: l7 V8 \2. 快速排序/归并排序算法 " ^2 _1 t6 m0 e7 G1 I* Z/ |3. 汉诺塔问题 $ _% a" k) Y# i2 ?1 P4. 二叉树遍历(前序/中序/后序) 4 l7 N& M* y: v9 C/ ?8 K, ~& P' M5. 生成所有可能的组合(回溯算法)% G; o! K& Y8 ?, V3 v# q
' T: v& ^* I/ K s3 x% {6 z/ X
试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒, 9 R' x3 q: @2 e1 i! W我推理机的核心算法应该是二叉树遍历的变种。, p1 ~ B' P% c( k7 T5 E
另外知识系统的推理机搜索深度(递归深度)并不长,没有超过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:" B' @, K9 S! A$ h. _
Key Idea of Recursion, P1 c" W$ Y. i' a' j
5 |, S- K, ^) O
A recursive function solves a problem by:, m P5 d5 r' n+ u9 s6 {
5 @0 Y# [) _# H, @8 _# j1 ] Breaking the problem into smaller instances of the same problem., u; I4 t! |# s* K4 } ?
. s0 C+ R! N' u; I3 u& o. h Solving the smallest instance directly (base case). 0 ~; b: n, a) h$ @: W$ r9 U9 M% m# `+ ]$ \8 S; h
Combining the results of smaller instances to solve the larger problem. ; m4 D7 q" w# M % S1 L+ G* x/ ^Components of a Recursive Function, k# `7 ?7 ^& H7 ^5 e
( A0 {) n+ W6 ~$ R2 M
Base Case: + J" C8 i# n" C) ~, E: \) | , p I0 j7 m: E( U! ] This is the simplest, smallest instance of the problem that can be solved directly without further recursion. 0 _0 Y7 i& Q" @$ L* N# G0 ?: k4 d( r V. `+ f- o0 a6 i
It acts as the stopping condition to prevent infinite recursion./ Y" v9 K+ o( I N( n
3 |' E6 x% @0 C B, h3 q, y) a
Example: In calculating the factorial of a number, the base case is factorial(0) = 1.9 I/ L4 V( A( q% g
1 p+ Y, V3 m4 E This is where the function calls itself with a smaller or simpler version of the problem. ( {: D2 s& D. }0 k 1 M0 P( A' I( m, W Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1). * X3 g. U0 O5 }* Z . J, e, U! T: D7 h8 w8 ^Example: Factorial Calculation 1 ]! w" j0 _* o( L; D* }7 F9 o0 ~7 a
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: ( x! W3 G& ] @) k + w3 z! L, ^4 v4 j9 k Base case: 0! = 1' {! J8 I9 R) i, }
& i$ ]2 f7 ?( f g; j# r# i
Recursive case: n! = n * (n-1)!, d' t" {7 t+ G t8 @( b( S7 A, ~
+ p9 Z3 e# D- J- dHere’s how it looks in code (Python):5 V3 D1 v- ^1 x/ P
python9 ]: M9 ?7 L' J3 ~2 H; F% D
! V7 ^& F& }! S" [7 q
7 c5 C1 U8 w8 k. odef factorial(n): @2 B; |7 s- X( k! A # Base case0 N+ N/ w2 d9 ?. U
if n == 0: 1 W1 o* W' z: Y& |% s return 16 w4 L( {9 w, v3 U. ~. k4 O0 _. l# C
# Recursive case0 X( c: r$ ]% L( `6 r
else:) t' e$ g& }8 t$ h8 r* H( ]/ k
return n * factorial(n - 1) 2 r. w+ x5 Z, W- j+ d, n4 _ ; _2 d! m# V Y8 _( A% p# Example usage # t) a! Y1 X1 F. \/ pprint(factorial(5)) # Output: 120* `1 o4 J* {/ J' r: W# ~) Y# O
( A- t2 s5 j/ j
How Recursion Works & D' A" h0 ]* ^* p8 ?6 i8 }. T! C3 m* q( [. b$ i
The function keeps calling itself with smaller inputs until it reaches the base case.8 \2 e& W5 x b6 O3 i
6 c* a1 k% h3 B# ~# p
Once the base case is reached, the function starts returning values back up the call stack. ! k; I- {$ ?( p 2 E3 ]% [5 S; F3 P$ V8 c These returned values are combined to produce the final result. - k2 b5 _9 D, ~2 p& H0 O0 ]4 F9 y f
For factorial(5): 5 v/ L7 s2 X. I+ S$ @* w. j4 B s# }' G8 `- n8 j ~
9 E& S9 \0 z: n) o& z/ t
factorial(5) = 5 * factorial(4)# g4 Q7 u) d: g% t+ o! a
factorial(4) = 4 * factorial(3)- ~5 S, S* Z# v/ Q
factorial(3) = 3 * factorial(2)# @1 x- _# ~1 \$ p
factorial(2) = 2 * factorial(1) 4 O+ Q: @# v0 e e2 Ifactorial(1) = 1 * factorial(0)( l2 Y+ C1 P6 v, V2 t
factorial(0) = 1 # Base case ' j$ O9 @ ^( J3 h, \/ c 5 t0 e# L: d( b1 |( uThen, the results are combined:) n) d6 j: d8 W/ Y
D/ U6 n' A3 n1 y0 [2 U
8 }3 f) `4 G- T, S$ p
factorial(1) = 1 * 1 = 1 ! z2 I, g: F1 {factorial(2) = 2 * 1 = 22 n0 |) m8 \& D8 h7 ~
factorial(3) = 3 * 2 = 6 + Y$ M" u6 u1 P' vfactorial(4) = 4 * 6 = 24 + E- y. z- J+ j' }7 q+ ]& i& [factorial(5) = 5 * 24 = 1208 m& V1 K7 p d/ D6 C
# ~7 o0 {/ Z! {; o% l
Advantages of Recursion ! G8 Q& b0 V# p* l6 |3 x$ |& H, w( t' Q2 [$ x z) p
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).9 Z- J2 R0 r; m! e1 Q- p1 V+ W
- r; \' j* v3 o/ k5 }( e Readability: Recursive code can be more readable and concise compared to iterative solutions. % O' g) L6 d7 [% {. g ( A8 D! J2 t! Z: c: a+ [) QDisadvantages of Recursion, ~8 [; `5 G [5 d$ Y1 \! j
3 D( g$ R1 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.* X% `% \/ Q$ B# O/ Z- J6 e4 s! I# k
* b- A! D8 C7 A Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization). # r' S* b! R3 Y8 ?% q% Q; y7 z2 i
When to Use Recursion* D4 A) X( z7 v% f$ F) X# k
2 {9 m6 p+ q( ~ Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort).3 r( |; P. B, W& O
$ Z) l% I" Z1 m
Problems with a clear base case and recursive case.8 U: C3 T$ L% ^- _, C' P
3 x, L$ K# V2 h: j+ i
Example: Fibonacci Sequence 0 l8 k+ i; W D+ {* Q" s4 U) c% X9 p8 J3 a
The Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones: 2 _/ q# b3 f# w5 m$ g# v" J& |* f: b. |
Base case: fib(0) = 0, fib(1) = 1 3 R1 G6 Y7 B3 E+ N3 \ 3 i7 r( A: {3 _) B( z4 A Recursive case: fib(n) = fib(n-1) + fib(n-2) ( D& d$ r, E3 y+ F/ ^4 c 2 B u' ~3 \9 O5 ~; O% kpython8 F( T- W- Q0 m5 }
, m5 `( F+ h1 c' C E T5 u+ r2 n A h
def fibonacci(n): * O5 ^+ _ r* i& {7 b X # Base cases6 ~& F. [; N" i$ g+ f0 R
if n == 0:, i6 {% C/ @" w; T% f
return 0 3 f1 q7 {3 `' O, F1 b7 e elif n == 1: ' t3 @3 z! D' a return 1 ! k* l2 l7 L( t' h% m # Recursive case * U5 s% Y3 g* ?6 k4 ?% W else:4 p9 S( W) A# X/ L) S6 {+ R" E
return fibonacci(n - 1) + fibonacci(n - 2)8 V6 D! ~" K U- y4 ^4 e
: r4 F2 G: P9 D( f! O1 A( K1 S# Example usage , `# ]0 @& Y' f# F: [" P4 hprint(fibonacci(6)) # Output: 8. k' W! Z6 q. m
+ ^1 M' d3 ~! S, B
Tail Recursion ; ?, z4 O. [6 Y! z* O ! T6 Y3 w. I y* _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). - H( J- R" q) g& z! M0 R4 m q: R3 Q1 [% `8 p
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 现在的开发流程,让一个老同志复习复习,快忘光了。