( r9 l7 ^( W- J; } B 注意事项0 d/ i6 ]5 _" F
必须要有终止条件 R- _" ?2 C, k. n% v, |6 o- E
递归深度过大可能导致栈溢出(Python默认递归深度约1000层)4 y i) l' N& M, l
某些问题用递归更直观(如树遍历),但效率可能不如迭代' |4 ?5 n0 `. m/ w7 x+ @
尾递归优化可以提升效率(但Python不支持) , o# u& l( W9 E2 B" q @6 Y 1 g1 O6 w/ n$ U( H3 ] 递归 vs 迭代 2 p7 p& T/ C) a6 @' F, t| | 递归 | 迭代 | . x' c! t8 j+ v|----------|-----------------------------|------------------| + y, m; Y% Z' i* B) I; g! d, s0 w' G| 实现方式 | 函数自调用 | 循环结构 | m' z- W- k, r) j2 h, _| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 |4 v: G% T7 G' | e1 D6 g
| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 | 2 B; Y' x4 w. R* \/ I, j| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 |# ^ F; u4 t- w/ g$ Z. g1 A* O/ e
0 Z0 n! B3 f# w. N; r 经典递归应用场景5 c H4 U' I; U
1. 文件系统遍历(目录树结构) 7 l4 N" r0 ~; n& | S' d1 ~2. 快速排序/归并排序算法5 O# w9 u* D/ \
3. 汉诺塔问题 6 l6 u7 ^2 g8 }" N0 R8 F3 t4. 二叉树遍历(前序/中序/后序)' A6 O" E. }5 K0 D, }) |7 D
5. 生成所有可能的组合(回溯算法) $ G, v5 p' I7 A, V$ Q: y+ M, ?. N0 j, ?/ B! a
试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒,/ E' r, |5 L) D; \
我推理机的核心算法应该是二叉树遍历的变种。 ) q8 N$ Y+ B$ S- J/ I$ k, Q3 k另外知识系统的推理机搜索深度(递归深度)并不长,没有超过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: / u4 K0 N# R: t& `( }2 i$ {$ tKey Idea of Recursion! B! {2 F/ r! j; [- [6 l, o2 w
* ~; \# m: h* d5 ^: aA recursive function solves a problem by:( S- `4 V9 \) h
8 t; e/ j$ o" Y, H Breaking the problem into smaller instances of the same problem.) h F8 D% z7 k+ m4 Q- }; B
$ Y# {' z# a$ }/ B0 p- H Solving the smallest instance directly (base case). ' i! Y& p/ ]6 I+ w( O. @2 h' p$ W% z8 I# ~' X4 d0 j0 v# I
Combining the results of smaller instances to solve the larger problem. . u8 O U* q+ [% s8 [, z2 i4 m4 q4 K" e& d8 W0 d* ^
Components of a Recursive Function% e" v2 ]' X! s, f* h* E* ]6 D% I8 w
, }- p L f! ?9 X" ` Base Case: 6 o/ o2 \: Y0 c! t. x3 r! v6 G: c; _- L; A; P2 L1 r% Y' r
This is the simplest, smallest instance of the problem that can be solved directly without further recursion.1 L( X7 C) q+ z
( I+ N7 }- \. }% ]+ o It acts as the stopping condition to prevent infinite recursion. 0 k' k6 ?" k; g, w3 t5 [" `9 |3 d* c( ]; f. ?0 J! h: D
Example: In calculating the factorial of a number, the base case is factorial(0) = 1.- n) J6 ^+ }3 o& N$ p9 h# ~9 X
2 V, j/ x8 E' e: x i# d | Recursive Case: - R& V* }- n- ~, b4 c) x. |# d: f2 z8 g5 S8 P
This is where the function calls itself with a smaller or simpler version of the problem.; S+ Q: o2 s" R( R
( f L. ]. b& p @ Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1). 1 o) o6 K0 v I- ~/ Q7 Q 5 ^& P; K# p3 i5 TExample: Factorial Calculation% J( V: y6 F" ^, V) f2 }
* ]! a9 o! A% g: C7 _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: * T8 Z$ q# V3 S; F9 O3 e* Z % {6 v; W$ T! a: Y# U v6 v! f Base case: 0! = 14 V1 E9 Y3 D0 E' x# } p1 u
+ W6 m6 B# p5 t. w' Z Recursive case: n! = n * (n-1)!8 w$ h/ [) Y) C% S* L* ?- a. W% Y
' m; P* y* Z" k0 N: b& x* MHere’s how it looks in code (Python): m/ K3 B1 G6 M1 Z: {
python# C: J+ |/ D/ n% G: @$ o0 N
- V* L/ @4 Z6 m2 a5 o- V: t8 y* o. b' U, C' |/ f
def factorial(n): 4 R) J5 Z: o- ] p) Q9 _' a/ A; B g# t # Base case 3 w% X. L+ ]6 X( g if n == 0: * Y2 {8 }- H5 v4 V* g return 1& b8 z0 }1 x1 P9 d( g, e" K/ N
# Recursive case$ y. B' S$ o! y$ ]' q1 c- h
else:" `' a% Z1 a2 p! R. W! F. R
return n * factorial(n - 1) ' s- y: b! x; r5 h9 \5 G3 m3 L3 g: X5 Z
# Example usage9 Z, X! }+ p p4 @; k# ?
print(factorial(5)) # Output: 120% L) l2 u. m ? r. T7 b
5 \# J, Y6 B% X( E! O6 ~
How Recursion Works$ {8 m6 \* Z/ h1 H
, Y- k: o2 D9 @; C+ W The function keeps calling itself with smaller inputs until it reaches the base case. ; H3 I0 M6 e" _+ Z, t0 C. }" o9 B. {- Q, M ^, P _
Once the base case is reached, the function starts returning values back up the call stack.6 f9 ~* ~& V+ ~* T: U
8 K1 i5 e5 r3 p/ v1 Q+ e These returned values are combined to produce the final result. r8 F/ q& P* y, w$ ^: {$ g ! {% z8 R$ [* a; e# @+ G, hFor factorial(5): 9 M& o( y( {; m: y6 Y( P* c% Y3 N; ? ( M$ `- O; ]1 e0 X; E. e* B J" a. Q+ v5 S( x4 B
factorial(5) = 5 * factorial(4) * B; y- x3 l& p+ V0 Afactorial(4) = 4 * factorial(3) 9 p1 {+ V0 H) y& L3 `' ^9 H0 Yfactorial(3) = 3 * factorial(2)* ~3 Q" }3 h/ T
factorial(2) = 2 * factorial(1) 4 d0 J% R4 Q, D3 ]" j1 J6 `/ Ffactorial(1) = 1 * factorial(0) `9 b; T' @9 a+ Z2 b: a/ D
factorial(0) = 1 # Base case 8 Y% h3 Y9 Z0 a & |- `% I1 }. v" LThen, the results are combined:. \: l" N* f; g
2 P1 v$ ?/ ~3 | " g3 j8 O! W3 g, u v7 q# A' Mfactorial(1) = 1 * 1 = 1* X7 v9 a- t) {' V1 H6 p
factorial(2) = 2 * 1 = 22 F* w5 l4 W' L" u/ c
factorial(3) = 3 * 2 = 6 ; s( n) N' r$ M: e8 b# ^factorial(4) = 4 * 6 = 24 2 @8 m0 C4 N1 _3 ]7 G0 kfactorial(5) = 5 * 24 = 120 ! r6 M4 Z% a0 O0 j* R# z* v: {9 o6 P2 w5 z) S
Advantages of Recursion0 M0 z1 n0 X+ p9 U. I& P' \( q/ Z w
; E/ G. l& Y# Y( A3 g
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).. {& c( u w$ M7 J/ q
# ^! k1 a9 ^4 T4 [
Readability: Recursive code can be more readable and concise compared to iterative solutions., B# I" o; O! t0 |
* y$ E3 U7 R$ z" H5 s; b! I
Disadvantages of Recursion 5 `/ U, w4 v2 E ' n3 f7 _, E" c& S# Y+ o7 l$ e 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. % j- `3 Z& L6 l) Y8 a$ B( @* p / w8 _; R8 U/ o) B% |, U Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization).1 u* w% T$ n1 G- k
; N) J4 @( ^! t4 aWhen to Use Recursion 7 h. p; N0 S% T0 s8 u% f3 l8 U1 y2 R4 f& y( S
Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort).9 ?# L |5 e# u: D1 H
" }! _0 s7 x! A$ D/ I$ a/ U, m
Problems with a clear base case and recursive case. " A6 y: C; Z8 y& F 3 _( V8 v# S. ?4 G( fExample: Fibonacci Sequence 9 k s5 G$ w9 v ( t4 R4 |8 \: \ j- {' y2 HThe Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones:& w) z* j8 Q% y F# ~0 G. N
; x; T+ a$ ]8 Q3 l" y* I+ P+ }. H Base case: fib(0) = 0, fib(1) = 1 / w# E! q2 c- O& ~3 U4 A! L% p9 J' f
Recursive case: fib(n) = fib(n-1) + fib(n-2)5 u U. _* E# o4 F! E, d) V9 k
. n J! h0 @# E
python : k3 o- G, [+ Y6 r5 B7 R ( L; e0 M/ w. V/ j5 V 2 C2 Q7 T) @% j1 h) Ydef fibonacci(n):2 U. u O, B8 v, }) V1 V( x
# Base cases / n! j- n4 r9 N, n5 h if n == 0:# l2 e2 [9 I/ n" a$ T- m
return 0: y, ^( R p1 r: l/ s" Z
elif n == 1:; N& {, \/ S7 r4 q) i
return 1* d' I- B0 ?& [# S4 M6 Z
# Recursive case 5 i3 G$ S7 l i else:5 Z7 O% A* c2 y9 E. [7 c
return fibonacci(n - 1) + fibonacci(n - 2)+ F2 O& u5 h4 o5 B+ Z* I
6 l$ g( D4 M5 p& Z) S
# Example usage ; J1 }: C: g6 x6 vprint(fibonacci(6)) # Output: 84 \. |0 g. y1 b) ?
, a7 ~( U2 r- {5 ]" a; | ZTail Recursion- E3 E. x7 J5 V- c% t0 y
2 S8 S9 \2 I" I5 h2 t
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). ! L/ s6 `; {% ]( A) S3 I' h7 ^: a; q' S V* V% r: x8 O$ a9 h6 ?! h4 Z
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 现在的开发流程,让一个老同志复习复习,快忘光了。