0 u, K1 x* K9 j! O, E" X: _2. **递归条件(Recursive Case)**7 m! J+ N6 o ~3 Y
- 将原问题分解为更小的子问题 ! N4 K, t3 U2 W) v8 \) q - 例如:n! = n × (n-1)!: w' f1 [8 i% k* u$ P9 D
4 S: T* v* k" d' @4 q 注意事项 " Z4 }; y7 {( r) Y9 R) q必须要有终止条件 . [8 a% p$ d6 p4 ~0 M: Y( u递归深度过大可能导致栈溢出(Python默认递归深度约1000层), z7 q. i2 y0 D# ^* s
某些问题用递归更直观(如树遍历),但效率可能不如迭代 % j2 Z0 T% w% D2 m/ P8 J1 N( x0 U, u. p尾递归优化可以提升效率(但Python不支持) 7 A- ?. f6 r$ ^4 r; V) z 3 [, Y2 {1 k: U 递归 vs 迭代 ! J! i% \2 a) W+ C* |4 E| | 递归 | 迭代 | 6 y2 I! ^" o0 t, J# l M+ S. n* V|----------|-----------------------------|------------------| # e0 N s" l) G1 v6 r* S8 l6 A| 实现方式 | 函数自调用 | 循环结构 |0 e$ D' I1 P6 _
| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 |- ^0 k# Z; r4 ]' W! }! \
| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 |, V+ C% W* s ?# f8 G
| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 |2 ~( b _8 i- o! c6 M+ j/ \
: O# M4 ?2 y" `' Q v: W7 z0 [
经典递归应用场景; n3 |: }$ [1 X, `5 r/ K+ B
1. 文件系统遍历(目录树结构): V4 {6 t" o+ { \/ }( p
2. 快速排序/归并排序算法; v5 e3 q. q+ v2 L' ~1 S% {
3. 汉诺塔问题% P q6 t3 r; ^- K: l( Q+ t
4. 二叉树遍历(前序/中序/后序) - M; \* \, @( D" Q3 b5. 生成所有可能的组合(回溯算法)$ q) ?0 f5 {& H; ]# W6 N. Y
& M' \" N/ n, ]; \% P* y, o试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒,5 O9 g6 W% {9 \& Z; o
我推理机的核心算法应该是二叉树遍历的变种。2 E+ y$ _1 d& 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:/ A. F G9 I+ m+ ]2 N/ R
Key Idea of Recursion Z) H1 ~% `& ^1 `, B2 j8 F4 l* ]0 _* m
A recursive function solves a problem by:0 B8 R5 X' L) P& ^$ R. T
6 _) N; A6 Q" J/ ]8 g+ ]7 R0 X Breaking the problem into smaller instances of the same problem. 1 p8 }) J, N- d* ?2 B6 J; o a; ?/ ?$ t% u% t
Solving the smallest instance directly (base case).8 V7 j4 W2 |+ Y2 m8 L. D. u2 ^
/ H; F0 g6 b: F, Y( d! V B Combining the results of smaller instances to solve the larger problem.# {% b/ y4 M1 b6 _; n/ s& X
( y U' h$ R- _2 ]/ O: e& V* {+ qComponents of a Recursive Function 7 I3 x. {) q* n# R # _) w& F: i+ b0 p. X4 O2 k, o Base Case:6 C; _7 } \+ h7 d( M j8 f8 l) S
- j, S" k8 m' I: T( H This is the simplest, smallest instance of the problem that can be solved directly without further recursion./ d9 d4 k( q# u; G4 S. Y
: }+ a' s- [; V It acts as the stopping condition to prevent infinite recursion. , N7 m7 ]: |4 h( ~4 E L% q* q
Example: In calculating the factorial of a number, the base case is factorial(0) = 1. + W, n5 W: U: _4 j& m2 O/ \1 N7 N* b+ ?6 y" q O
Recursive Case: 9 C- J4 L# x" _# P $ {* p) s( b+ r2 P& `! {5 `9 k This is where the function calls itself with a smaller or simpler version of the problem. ) c& t3 U" q* ? {8 M; |* G4 {' z: \. E: n
Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1)." A. |3 P# p9 A3 @# U( u
9 j2 ^- O" r' u6 |Example: Factorial Calculation( h8 _5 I( H. v! z8 `+ ^' [
' s& o9 ^) V5 z4 s% s( ~
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: 3 c, D6 S9 L- u; \7 r! A9 S: G( _! ?5 t0 E6 r! Z3 ?. x
Base case: 0! = 1 _* w( \2 I- H' l 5 ]( n) H/ t8 | Recursive case: n! = n * (n-1)!8 ~* u- `( S# J: r
3 n9 `0 ?- F. a1 z" O9 SHere’s how it looks in code (Python): % P3 |6 {5 I* ppython 0 \; l, ]1 H6 ] 0 m1 k' E9 U2 z* c : k' B, s2 R" |* Wdef factorial(n):9 `, n/ c, l) g& z" x6 f
# Base case % c0 u: l8 `6 D- U4 z if n == 0:# J8 s: z- R5 d. {1 W
return 1% j, Y7 O1 F/ K6 J% T2 p/ }/ z% L6 T+ e
# Recursive case 3 N0 V% @% q5 Q% P else:( f' z6 B0 E% a2 L
return n * factorial(n - 1), o" F8 o0 ~; C) g$ o: E# m
! ?; |; B! u$ b- t6 C, k
# Example usage/ o: l7 R9 B/ ^0 m5 h
print(factorial(5)) # Output: 120 5 }3 z3 }9 x# C1 m# z. [4 U3 N2 |6 ?) {9 Z2 b* M$ o2 r
How Recursion Works ! D) d5 v/ i3 o . j; { O7 e$ z) g- S8 c8 Y3 g The function keeps calling itself with smaller inputs until it reaches the base case.0 G% @$ V, x# m6 ?, E
5 ~5 j: I/ U) _ Once the base case is reached, the function starts returning values back up the call stack. * O/ F. Q: B b7 n7 M( A; l0 y6 G / y& T- S! u- ~* G' P These returned values are combined to produce the final result. : U$ C* |( t9 x/ y6 X - g G2 N" z! X' L a! @For factorial(5):6 m l2 z! q5 i V
, ? p" g3 P* k* J: S- @9 z0 K 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).. Q+ b& B- c% t) z
6 }6 O- n# ~* u: v+ n
Readability: Recursive code can be more readable and concise compared to iterative solutions.1 {8 y9 X: C) s
/ R6 N4 g1 E/ W/ X1 b+ u6 m$ `5 ^1 Q
Disadvantages of Recursion 5 z* ]- ]9 {: D0 R5 L. T& U" y: I, o- V9 [7 r7 w$ L
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. & L4 A/ `! A0 M- `! g! N( b! t" [ 5 e3 Q" f2 Z* r* ?; ] Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization). / C5 x- X0 R/ F8 B& u 9 V/ ^ O: |6 j6 PWhen to Use Recursion 2 r- j0 q/ C( L }3 T" s" u' `- Q 6 ]- q5 \& @+ ~3 M9 U6 x9 C' M7 d Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort).( l# R- ]& w* C' H1 I! T
7 H* ~5 X( I( }7 g
Problems with a clear base case and recursive case. " d( a( F* W3 [* a) z. X; Y, U& |; `. R/ u6 c! Z6 t/ e4 n
Example: Fibonacci Sequence 3 `. @7 [% ^$ T, N / @7 B7 W' w, m- p pThe Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones:5 [4 i; k# L9 |; \0 [1 ? ?
( N: S& w5 }+ ~: k E2 ^: t. S Base case: fib(0) = 0, fib(1) = 1 # y# x& ]! a0 j, S, H5 B ( y' v+ z$ g- \0 M& r3 o Recursive case: fib(n) = fib(n-1) + fib(n-2)* s6 K- y8 }' M7 L+ [* E) M& t
: D, y- f# P% n# }python % D8 J9 F) ? y3 R5 C4 e2 s1 E+ Y7 y, D' _2 q
& d. |8 g/ b/ ]+ r
def fibonacci(n):/ T4 g9 d1 {/ \* s* r4 M) g0 ^
# Base cases 0 W+ t6 v- W: s9 B if n == 0:2 D0 X4 M: K# ~7 F
return 07 R: j9 o" I2 p" a7 `8 ]
elif n == 1:" l3 J3 m9 O$ Z" m+ K+ ~8 b) z
return 1 0 T& J b# r2 U9 z # Recursive case+ \; u3 C& }& I5 E! @. d4 [$ s+ v
else:3 `" z W6 ~4 B% N* l1 Z+ f
return fibonacci(n - 1) + fibonacci(n - 2) 8 u4 p6 [. v( d # C* d1 h: U- w; s2 c2 [1 J) D# Example usage$ |6 T- t" g! ~% R
print(fibonacci(6)) # Output: 8% u$ r, {) r) A/ T% @
/ I& c! Z U1 Q
Tail Recursion 1 f6 V6 R( v l/ [5 P$ ~# E. \+ L3 ]: q1 z
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). " S5 r# x* X3 U. b7 [1 T3 y# E% {! x( x6 L
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 现在的开发流程,让一个老同志复习复习,快忘光了。