$ r' ?& w1 V* M4 m2 e9 p r" Q 注意事项 - F% g* b+ H( O, r% o必须要有终止条件 % L$ s8 R k# H) }. D' V递归深度过大可能导致栈溢出(Python默认递归深度约1000层) ; C6 {# k. }: e: b4 Z某些问题用递归更直观(如树遍历),但效率可能不如迭代 Y; f% r& ]" d尾递归优化可以提升效率(但Python不支持) & P, R2 \- n! y( m* @% u: b H 6 Z, ^+ e2 a( W% \ F 递归 vs 迭代 8 p0 ~1 [, i3 |4 v| | 递归 | 迭代 |# m9 d) F3 t: F, g! k9 _* W2 f
|----------|-----------------------------|------------------|$ ~6 i& s8 o8 S/ L- f
| 实现方式 | 函数自调用 | 循环结构 | W3 A+ P5 ~% V| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 | 7 v6 p0 A" Q/ y- x7 r| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 |6 J4 q. Z, Y/ s7 H |) M2 |; j
| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 | e* Q1 m9 O9 l) g! @+ N4 b" N+ L# x4 c6 r; ]9 u5 q0 P
经典递归应用场景 & l0 A) d0 h# c1. 文件系统遍历(目录树结构)5 W- U/ Y# i$ L! n2 X* q; e
2. 快速排序/归并排序算法 ) _9 e) z% N0 f% A1 e4 p2 X3. 汉诺塔问题5 `6 u# e$ _& B
4. 二叉树遍历(前序/中序/后序) & h/ [- R; i, q0 C8 I3 a5. 生成所有可能的组合(回溯算法) - m" B- ?: L: G8 Q% b! q+ I- K5 m( U+ s# ]; c0 ?8 p$ b
试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒,; Y: ~9 c% q, d# k
我推理机的核心算法应该是二叉树遍历的变种。6 U/ Q/ N# }* Z, Z
另外知识系统的推理机搜索深度(递归深度)并不长,没有超过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: # N& H+ _6 z8 o3 ^Key Idea of Recursion 4 o2 K2 j( ^+ P& ~% j3 W ; }$ Y# k8 J: ~0 k/ v5 E) M9 [A recursive function solves a problem by:' T. }; y6 ~4 W p2 ]
# l9 H8 T8 X: F8 P Breaking the problem into smaller instances of the same problem.5 Q) `: j G0 C/ h2 X! r. g
! z% w( [) m: c- a# }, h' j
Solving the smallest instance directly (base case).8 S5 t, Y- [+ G9 B
! C! ~6 s% z8 y+ y5 O
Combining the results of smaller instances to solve the larger problem.8 `* k8 s; m* ]
* w) P. S5 r7 W/ y- G" tComponents of a Recursive Function % ~+ m: ~% v" C/ v5 T/ ]( K" [ l. n5 d! X
Base Case:* n: A) }# x6 t0 z4 F, i5 N8 d& N
! `; n6 n |( s
This is the simplest, smallest instance of the problem that can be solved directly without further recursion.8 k* V" }$ U ^, k0 d0 w0 t, M
$ m) @( ?9 V- m# E
It acts as the stopping condition to prevent infinite recursion.) X% U, W2 V* D
8 C$ O8 Q0 \" Q- Y8 v: [
Example: In calculating the factorial of a number, the base case is factorial(0) = 1.2 \6 \, u. `6 p. k- s
& R4 K1 h w7 m2 m* u- V% t Recursive Case: ! _' X7 A# {( c* J2 u1 a M4 n0 X- l w+ n6 ~& ~9 L+ A) n
This is where the function calls itself with a smaller or simpler version of the problem. `6 F9 N8 k! Z* @
# q0 t) G1 i2 {& A
Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1).# I# B& a5 N; H/ _7 \ R
$ W: k' F, m; h2 k8 B% @
Example: Factorial Calculation, f8 o) N2 S6 C" I, x6 W3 ^1 h9 T# N
?; e1 E! s) s" UThe 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:! d9 M7 R% L9 y; [
* M, K3 H7 `1 R" m Base case: 0! = 1 0 T3 i# a0 K' r, P6 @1 ]: P5 _1 r* w1 ?
Recursive case: n! = n * (n-1)!3 c Q: I4 G7 L: P
' {5 d. i! t7 E' ~% B
Here’s how it looks in code (Python): - u. t1 g3 L' W4 v& g3 bpython$ \, H2 t2 c+ d. y, u9 u
$ X4 Y+ E" u& Y7 y" N* m- @# O$ j8 ?% e
def factorial(n): 2 F4 m3 I- G R* e # Base case( T z% A7 J* h
if n == 0:6 B1 |+ g- ^! g% Y# G
return 1- a1 T0 H: o$ Y6 G7 A8 G) X
# Recursive case 3 v# t0 x+ v/ K7 l$ w else:4 o) d" w/ S0 u3 G' S: \7 I
return n * factorial(n - 1) 5 M) g; I0 E# E* l( M) f- F, h
# Example usage( o$ g7 p( |' w& g2 p1 }
print(factorial(5)) # Output: 120 7 J' J! @. V8 E+ }- S+ x( s/ `8 }8 ~( q! u }1 w
How Recursion Works 1 O7 ~4 ?0 Y3 J K; f. ^8 O2 I! Z p2 V9 b5 L7 E' n$ {& v
The function keeps calling itself with smaller inputs until it reaches the base case. / N$ |# v1 T" @( w- F) z' S; V/ u5 |
Once the base case is reached, the function starts returning values back up the call stack.( a4 v4 Y% Y6 C; i% w
9 H8 z6 |9 @+ J% b& N& v These returned values are combined to produce the final result. . I$ |/ i1 S* E+ r0 y" U - N8 d3 a7 c$ kFor factorial(5): / X0 Z U2 S9 M 0 Z) \# {+ v% a: ~3 q# W# `3 i, ^" v
factorial(5) = 5 * factorial(4) 3 n/ D$ M) o2 ]/ b% g5 D7 Yfactorial(4) = 4 * factorial(3)8 m7 J1 k0 R. k- V. }
factorial(3) = 3 * factorial(2)8 M" \, L( q4 w ~& W
factorial(2) = 2 * factorial(1)2 u `) h: y9 v$ S/ W t9 g
factorial(1) = 1 * factorial(0)0 `5 |' `% E0 F8 W3 U6 q
factorial(0) = 1 # Base case8 |* ?! E# R1 {6 z
: @2 {2 K& g4 ~$ PThen, the results are combined: 8 n$ q# k# M" w7 B( ` - M5 f; i" ?' Y6 c: f) }" d2 i* w1 m# Y) c1 L0 ?2 p6 F4 ^
factorial(1) = 1 * 1 = 1 3 H8 M3 w; ^9 gfactorial(2) = 2 * 1 = 2* l7 M6 P/ y" C( P' R3 \6 C
factorial(3) = 3 * 2 = 6 & \; M3 C) B, S Zfactorial(4) = 4 * 6 = 246 @& J" ~9 Q% z5 `3 Y' e+ M* n- n
factorial(5) = 5 * 24 = 120 + D U/ T2 E1 ~3 v7 m" E- U / ~8 I4 U z3 @- S+ h6 E5 FAdvantages of Recursion + |+ y! e! m: D+ d) T: u+ F( Z3 Z6 I7 R, l$ L3 d3 U) z N" |9 K5 d; ?
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). 8 n* [7 C( ?& H1 k7 j5 i- f4 F . B; b x# w; J# g3 L( S2 p. _ Readability: Recursive code can be more readable and concise compared to iterative solutions. ) O0 l b; K- n1 m! p, n. H$ P9 A @* E: ~9 O! ?& ]$ K _
Disadvantages of Recursion4 X$ }7 p4 v& r
9 A: D, e. o E/ j* \ t3 K
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. 8 `3 j" L5 }. ?8 u 8 i! }+ T' K5 P- H! ~" h Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization).8 P+ E, d. D- J. T. p
) W1 s0 w Q! }) ^When to Use Recursion ) T( n8 X. Y& I, w4 [& D0 B% S+ a+ a! S0 v
Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort).) `1 [5 I* _; `8 r1 ]
. N! I) P9 _' K
Problems with a clear base case and recursive case. 3 O. Q; f& _9 A) `/ w+ v# H ( d& U2 a: ^: A3 q4 ~% zExample: Fibonacci Sequence 6 v# y8 k3 W( _, t" A ( e z8 g. H# Z3 m2 v5 sThe Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones: + C) M% n: e, {$ [- u/ f1 W7 ^ f - w1 P1 J- }, U, H( O7 M Base case: fib(0) = 0, fib(1) = 1 ! M* k7 n% r, e" _* w & L4 r7 ` y" F( C Recursive case: fib(n) = fib(n-1) + fib(n-2)- M/ _% J; o& P5 l: W; F8 }% G! S; C
, M/ o3 c2 u) |' M0 xpython% J& S) l1 f* m1 A0 w
4 |; [; [: B, j: O. {- V0 D
" f7 i$ \7 \ \( u, R) R( mdef fibonacci(n): 8 c+ a# y6 ^7 o. |1 E2 d& K # Base cases " I# K( t r; Z, d3 `0 s; M" q if n == 0:0 Q$ {. B% a- T4 M8 f
return 0/ H( o, r& ]7 B U. U+ \
elif n == 1: 3 I t$ N# R+ J/ @/ g5 k9 U return 1 Y% s/ z9 {* _- G6 q
# Recursive case0 o0 t( E( s `# B, p' i
else:- B2 r/ W0 M1 |( `
return fibonacci(n - 1) + fibonacci(n - 2) J: ^' j7 }+ ]3 i* E
8 N7 ]9 Q' b' z% y- `: h
# Example usage ) B, P: i1 K0 A2 X; C/ cprint(fibonacci(6)) # Output: 8 8 v, ~$ z5 i, O) \! i8 {" Z& s+ T/ }4 g9 P/ n. \2 @* x; \
Tail Recursion9 \8 n8 V3 ?" E+ d$ c6 u1 {7 N
( @) Z* Z) Z- S8 A* \5 ?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). % z e4 [7 Y) `+ j2 O- o: | U" L3 z7 n+ 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 现在的开发流程,让一个老同志复习复习,快忘光了。