; G# I. k- F' C! {3 h 递归 vs 迭代, H7 n+ N, u+ z5 U
| | 递归 | 迭代 |* V5 Y" u# \( _( B- F. D4 G8 _
|----------|-----------------------------|------------------|9 l/ p. Y! c& y8 q0 v
| 实现方式 | 函数自调用 | 循环结构 |4 [4 `7 ~1 j: X$ K
| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 | 9 x# h$ a& l, c( Y) Z| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 | & j O, l! C8 ]1 T( L7 H- f| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 | ' I9 \ K4 i' n2 _7 P5 q# E% ]' B 7 {0 _0 _# Q7 b% a6 q2 O5 M 经典递归应用场景1 V- E& @* T8 q/ j8 a3 ~
1. 文件系统遍历(目录树结构)1 t2 R+ R: q& ]/ B
2. 快速排序/归并排序算法 * i! h4 J- l+ Z3. 汉诺塔问题 8 u% y) I- k' ]( m9 ]5 J& ]4. 二叉树遍历(前序/中序/后序): T) l: S/ V3 Y$ w4 p
5. 生成所有可能的组合(回溯算法)8 w6 f y* Z* {6 }. u3 h6 c# L
5 |; y0 |: Q- z3 }& F3 e* V/ r* j试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒, ; [9 v I+ s) Y/ w5 g: }1 S& @我推理机的核心算法应该是二叉树遍历的变种。 ) u0 L, ?3 o3 Q& H0 W' U1 M' q另外知识系统的推理机搜索深度(递归深度)并不长,没有超过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 Z0 G f5 y- k
Key Idea of Recursion # z- \1 O3 I5 O; p5 v# K d* ?/ f7 `" h4 F- H. ]( r9 i
A recursive function solves a problem by: }4 l6 ~0 N6 {7 t; U 4 m6 g# n& Q2 E3 c6 ^- d Breaking the problem into smaller instances of the same problem. 9 V8 T7 h, d# M4 v$ N" X , O5 { A' _. v6 @2 k! j Solving the smallest instance directly (base case). 6 N' X% u W. B I8 h4 d! O; P& A0 [- Q
Combining the results of smaller instances to solve the larger problem. + `8 P7 m, Y) L% n ( ~# ?' h1 Q) {4 X7 LComponents of a Recursive Function 4 a+ C9 g0 T, t# b: O+ M* Z, P / R+ j( Z h' h1 J6 b- t5 f Base Case: E6 \. V4 O" J+ l/ \ , U( g8 M' x8 O. \ This is the simplest, smallest instance of the problem that can be solved directly without further recursion. ' O2 G8 v! A4 Y E( N v, ]' x( E/ F; Q5 K% ~3 y" w
It acts as the stopping condition to prevent infinite recursion.* [0 B) ~( l" Y% h
! W- O6 v! l5 y# @: B* H Example: In calculating the factorial of a number, the base case is factorial(0) = 1.5 M3 D/ w2 \6 ^1 u- T' z2 Y/ e( z6 \- d
$ R& L" i" ]* R5 V Recursive Case: 0 Q# P3 h% t; i3 t3 y7 e" _' a$ Z. U; o! Y1 p
This is where the function calls itself with a smaller or simpler version of the problem. ; ]" G7 w# L" X2 H ' X0 m+ }* z' Y- t% \) v Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1).1 P$ L: Q% `2 I7 M
/ x& w' v2 L7 m ZExample: Factorial Calculation * O; |! ], v4 R( q- I 9 ]7 S) c( s9 r- T0 Q% RThe 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 ]! E: y" {$ D/ U+ G% v , t3 e2 K% ]3 k Base case: 0! = 1) B3 U% E4 g( ~. I& k
5 b; u8 p) u7 t Recursive case: n! = n * (n-1)!, |! a/ Q8 W$ B$ Y9 C1 H. {! W& X- b" R
. S* ~5 w, `& q3 j FHere’s how it looks in code (Python): q% m4 o* a, A% i% }8 c- u
python 5 V$ c$ v4 o& _9 ^ " t- j% M- _1 H 1 `! t0 o% D' S: r sdef factorial(n): ( G% V3 X6 R, L" F. E # Base case ; j* ?$ J1 G5 L& d, S7 t if n == 0:2 o% b5 k- q; W, A/ k
return 1* }; K, w/ _5 p) K1 c3 J+ |- x# {
# Recursive case& A) A9 Y; ^/ [8 ]: @
else: " W! K& W" D4 A. ~* m0 ? f& i4 [ return n * factorial(n - 1)2 G8 A9 Y, v5 \ m h. M' }" [+ c
( b3 |: i* ^% E3 \) M, x3 L8 B R. K The function keeps calling itself with smaller inputs until it reaches the base case. * H3 w+ b( u; k8 U l* g9 j. v6 y
Once the base case is reached, the function starts returning values back up the call stack.- l4 L. T& i& ^) ]- a3 x' s' ^
( P) A/ n K% R3 }0 `; h: w5 D
These returned values are combined to produce the final result.7 }, }8 h; l" ^( D% o" L
! G6 _" J3 z) Z$ @( w0 d" v
For factorial(5): # O6 G9 t# w/ c# Y; W8 _3 |% I0 s5 v; E, T' i" p* C$ e3 g: H
4 r6 x: F% C7 m, kfactorial(5) = 5 * factorial(4)+ k: ], u5 a) X# \- x- k
factorial(4) = 4 * factorial(3)5 _3 h# I! P/ ^2 E' s
factorial(3) = 3 * factorial(2): U# o( N( k$ {! S D4 z
factorial(2) = 2 * factorial(1)2 G9 X, ~" ^- |, J) u- C& T" h2 ^( d3 S
factorial(1) = 1 * factorial(0)8 |3 c7 O# l/ ?" T7 @1 v% _! K& j
factorial(0) = 1 # Base case" D" `5 b# n" F
* H& Z$ ^' C* d9 A
Then, the results are combined: " t2 b0 N3 f; s4 u6 q; Z. r# t/ ~/ ~/ ]- q) g
2 B- ~; U! X. p4 f w3 H( q
factorial(1) = 1 * 1 = 1 3 x$ e' J$ I# Dfactorial(2) = 2 * 1 = 2 7 { A+ `' f, K; ?2 w5 lfactorial(3) = 3 * 2 = 6. n) A3 a* d- v5 n% d/ G
factorial(4) = 4 * 6 = 24 4 R' B" R6 M" \. Q. B4 y+ _* H! X* cfactorial(5) = 5 * 24 = 120: ~* P: F# _# r$ v5 J" m
4 k" R; H7 w6 {* p+ G+ x2 }6 {8 f! j
Advantages of Recursion ' e) `" N* C" q& B$ `6 f; w7 C2 d* ?3 V) k* @$ B
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). ?0 A9 B+ D6 t+ m( ~ 0 E. ?* ]$ A2 A& D Readability: Recursive code can be more readable and concise compared to iterative solutions.5 ~' ]* u, i+ e& ]! D8 [
) H7 P, b8 J2 ^! \0 [& ]: S% kDisadvantages of Recursion" j( ^8 t& r. e! G& }* Y0 F
' T* L2 U* E% w1 D/ Y' Z
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. ( q% J; N$ |; o+ c8 a2 w7 j3 c. U* s! d; ^
Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization).- N) [6 a1 _ Z* H" d
# d5 }4 }" C/ W3 x5 I, t! c
When to Use Recursion . r- N4 T3 ?8 Y$ O+ g 2 z, q# Z0 v1 |1 J) X- O9 j2 g3 A. ^1 r Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort). 5 { h, _; E- Y , x5 b# E- z Q, }) D) q Problems with a clear base case and recursive case. ! C8 G' S0 q8 C5 T6 P* a; K& r3 J, P- z6 G1 B
Example: Fibonacci Sequence 8 K6 K$ ]* O& L: v, L1 {& ~( V3 L4 }* S8 v0 ]
The Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones:/ | ?" f1 C6 @+ q8 C
+ y4 ]! }8 L6 w) M$ |1 E0 j d
Base case: fib(0) = 0, fib(1) = 1 9 [0 v9 K3 E" u! J* L# X6 a: r; A' G+ {6 }6 {; q) R8 q
Recursive case: fib(n) = fib(n-1) + fib(n-2) * J/ ?% y" q! a. K' `0 S# |" r+ |) e+ F
python' K3 Q" I( y q" u* f
, h4 R5 s; l. O. H4 _( s# o4 c. P. ?' X2 {
def fibonacci(n):3 N' b, W, H- t A% e) i
# Base cases) i) h3 e: l: ]6 z
if n == 0:* \7 [& |, t1 q3 [ Q& W1 N
return 0 ' Y* z6 H# j, [0 w: b. R elif n == 1: ; b- V5 ^# Q; [2 t" `$ c# F' w return 1 & B/ g" S. {3 S: H1 w- ?' f+ G # Recursive case6 j( j8 K& L7 ^3 r( R: q
else: ( q9 W7 C) o/ O! {8 Q4 y+ \ return fibonacci(n - 1) + fibonacci(n - 2) 0 r8 m: n/ ?9 q M4 Y4 l2 b; w8 a8 L0 L5 Y
# Example usage ( j' c, i7 B' y1 J- Q- Fprint(fibonacci(6)) # Output: 8 / b2 Q! |6 z1 |; f/ U" z1 Q6 O$ `3 J2 k$ M
Tail Recursion # T0 @( }9 E2 M8 g9 } 9 Q1 a+ P7 y3 [9 c3 n/ y7 _4 `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). ; F7 P) u6 |2 ~+ x4 @0 l$ c 9 E2 U. y1 I$ L& b, TIn 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 现在的开发流程,让一个老同志复习复习,快忘光了。