' n( E9 i# c F0 @( e# D7 [, ?; W2. **递归条件(Recursive Case)** + H5 C+ p0 i# u6 ?* g: S - 将原问题分解为更小的子问题 , O5 \" F8 S# l | - 例如:n! = n × (n-1)! # m7 Z1 z( s3 w& E, I7 p% e5 V9 x8 L# ^5 V2 Z% B7 s+ ^
经典示例:计算阶乘 ; d6 D/ o9 T* s/ H* Q1 F* w+ Lpython, }. P; ~/ C& D$ ~5 W3 y
def factorial(n): 9 X* _1 P- _" h6 S9 ^. q5 m if n == 0: # 基线条件 ; D( F2 C/ J' a return 10 Q. r v6 t- q& b
else: # 递归条件 " f( |4 m: A+ y, t( Y, s$ t return n * factorial(n-1) ) v3 V: m/ r" ?0 N- C/ w执行过程(以计算 3! 为例): % s5 `' `* y+ sfactorial(3) 7 h4 M" Y) ]4 f4 d* x3 * factorial(2) 6 L6 D5 H4 r) [4 U6 G H3 * (2 * factorial(1))/ \5 ^7 m1 A6 f3 U0 E8 _
3 * (2 * (1 * factorial(0)))' |* e" c* Y7 R" [
3 * (2 * (1 * 1)) = 6. s& S* a) _6 y: J9 F0 Y
" ]. Q) U# e/ Y2 y; |; J& j
递归思维要点 , u7 ]2 J2 I4 X* e; ` Y: s1. **信任递归**:假设子问题已经解决,专注当前层逻辑2 M5 h/ O9 f; n# i5 K9 a* [
2. **栈结构**:每次调用都会创建新的栈帧(内存空间)( K/ |5 a7 t$ N8 h0 `
3. **递推过程**:不断向下分解问题(递) $ s% W: n& e% f2 J: X& f1 j6 d4. **回溯过程**:组合子问题结果返回(归) : e, ]0 x- g9 Z( u5 ^: Y 7 Q. n6 M' S/ u 注意事项 ( i# [6 s" H! [# ~! V3 c必须要有终止条件1 C' ~) S1 x% O9 H+ a0 H$ }
递归深度过大可能导致栈溢出(Python默认递归深度约1000层)6 K9 Q- j; r- ]$ r+ g
某些问题用递归更直观(如树遍历),但效率可能不如迭代 ' b/ |) _2 K' \% G. ?' X尾递归优化可以提升效率(但Python不支持) ! W! H( k8 g' V' z3 ]( o6 F8 c: D# n1 V# V. m; f
递归 vs 迭代 2 u# R8 c& X, a7 c! k4 X| | 递归 | 迭代 |, I2 u/ R6 s6 i+ w2 Q
|----------|-----------------------------|------------------|8 t- ~+ P# m+ l/ ^1 c0 q) K/ M
| 实现方式 | 函数自调用 | 循环结构 | ( _. T1 S3 B: i. _9 \! s3 G| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 | " \% d( W6 h/ g2 G* ?* U5 M| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 | % [3 p$ n9 t' P- N# u% Y4 m| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 | * |" s' S( T+ G( V6 Q ! f! \8 N" Y6 t! S, E 经典递归应用场景3 y, q J0 p( ?9 x& M) m& E% q6 w
1. 文件系统遍历(目录树结构) , X, u; E6 ~* Y$ [" {" _9 Z* l2. 快速排序/归并排序算法 ( p9 z0 I& ~. @3 I* k& i3. 汉诺塔问题 : r) [( ]4 N8 a! O4. 二叉树遍历(前序/中序/后序) 2 @$ o. \' Y; f: G, Z7 k* z5. 生成所有可能的组合(回溯算法)7 U N% y% b. R1 j) M
2 D1 `* B. U( X8 v) w
试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒, . ]/ Z9 q _7 \# D7 v8 j. s我推理机的核心算法应该是二叉树遍历的变种。 $ `- C$ k; l7 C# C4 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:/ i1 K! V! _9 \ S6 W$ ~$ M
Key Idea of Recursion, O N- M0 M6 F) |, H
" A; }; W4 L# ?* d' oA recursive function solves a problem by: 0 Q+ ]! q/ b& S) ?% Y - ~+ e+ b. F& J; W9 | o Breaking the problem into smaller instances of the same problem. 6 i6 ]5 d0 O+ A; y 7 C& ^/ a5 W% n9 ]' E+ ^* A5 E$ J Solving the smallest instance directly (base case). % {% p! K' M, }7 G& e: a 8 `9 R: W, V4 q5 ?2 R$ d Combining the results of smaller instances to solve the larger problem. ; Q3 f6 u# Z/ _- K , C0 y! G9 T* _$ XComponents of a Recursive Function % J3 r0 p7 ]( N {) b9 F V0 k; y, R% b {' i `7 C+ B
Base Case: # ~4 Y) |3 e2 d3 P. ]! w$ N" l! m* ]" \2 O1 Y( ~) a
This is the simplest, smallest instance of the problem that can be solved directly without further recursion.! k3 C7 o9 j5 `& k
3 i8 t: Z# j& h+ ^5 {% S2 }& { It acts as the stopping condition to prevent infinite recursion.& ?6 G. G; g0 t: H$ r, q
" D/ z1 N' Z4 Q; {
Example: In calculating the factorial of a number, the base case is factorial(0) = 1.. W. h) j: N$ R( k- F" d( s% x
/ C7 _' R5 | _' k6 |8 D& L This is where the function calls itself with a smaller or simpler version of the problem.( Y/ x4 }5 m2 {& I
' r: F* }* f" n3 N3 v Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1). , I& Q4 L0 l2 L) _. {7 F! M& |8 B 8 ]' x; ]2 w$ A' vExample: Factorial Calculation ( m; ?& P- F9 w, o% j 6 B: k) f7 V3 J8 mThe 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:/ O; ~* r& }4 ~$ N+ N W
' }5 |/ u$ W2 s7 h! g9 B
Base case: 0! = 1 6 M4 s4 J3 Z9 S, A) G% q( P b! n! R9 M1 ]7 Z7 D
Recursive case: n! = n * (n-1)!0 t, U0 x3 ~- P% @+ K s8 M5 g% r) G S
; l) u* R% Z7 o" S* kHere’s how it looks in code (Python):# }1 ]8 O, u n4 ?3 Q: _7 O8 r
python# k/ l9 `2 K2 _6 P: D9 G( v
# ^' `: |5 ^! A/ t8 C3 Q9 ~
" N6 V% ?7 H9 [% w, ~: d1 Edef factorial(n): ( H# d; G5 A# F; k) e, l # Base case9 N9 z, A3 K: |5 \5 M- s8 H; g' w
if n == 0: ) ?# c. V3 r/ S3 g( c& [ return 1 - }; b l* T! I$ x2 s: n, S # Recursive case 8 B- m+ k; ]$ L else:3 V. n7 F6 U9 q, Z$ n
return n * factorial(n - 1) " J+ `; v. D) h, X' n( }* l9 t% S0 |7 W* f
# Example usage1 l! \9 G# a. A p( q
print(factorial(5)) # Output: 120 " ^ E/ {* l3 r. _1 F7 [" ~: x& E, n0 f$ E2 p; K, b
How Recursion Works, u8 D5 z3 e6 T9 z2 }
& Q1 i+ ?% N( H3 k l$ C8 X3 c+ |: ]
The function keeps calling itself with smaller inputs until it reaches the base case. - O% w& V9 Y# C n; q* \ 7 b i7 J) _, K2 |. \* r/ S Once the base case is reached, the function starts returning values back up the call stack.* n# F* O/ T5 y( J2 U! \* [. m
1 j8 d: Y$ H1 p; S) `+ U These returned values are combined to produce the final result. 8 T% D3 D# d4 f $ P5 R7 n/ ~3 d7 a# Q8 |9 \% t% HFor factorial(5):: x7 Y( G( E2 j2 H; N
. V! q' N' |1 k: N& oThen, the results are combined: # F- i0 w+ {3 K+ |, h5 u- S) c 4 p% I0 g9 o, z+ M \+ q& k& k, N E
factorial(1) = 1 * 1 = 1 5 `4 u( A S% Y/ n& Vfactorial(2) = 2 * 1 = 2 9 F. t% S3 L% j& afactorial(3) = 3 * 2 = 6% S% b f. Z4 }: |, Q a1 v
factorial(4) = 4 * 6 = 24 y; }$ S x! w1 {. L$ ~
factorial(5) = 5 * 24 = 120% Z8 h% `3 }' s5 q4 W
, g. Z. o; K, V9 m( T; ]
Advantages of Recursion ' F5 f4 e2 K8 s) i7 U0 J " |* d T$ X4 ] N8 c. U% E: B9 ]1 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).# _" B; P$ y% j: _
1 [9 [% A, B4 w- Z& V! \
Readability: Recursive code can be more readable and concise compared to iterative solutions. 1 B, S6 L$ F7 w- ]" g9 p; N+ g; e& }* v |
Disadvantages of Recursion $ {1 |5 t0 m, A2 P% a3 C$ c$ z {: I s7 B% Q0 {, F 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. $ ?9 t, P* N# L6 P5 h4 R1 M: }+ M- H( a& s3 J1 z |3 w
Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization).$ A6 G# q9 e) H7 o0 S% B7 X
' ]( w+ z, }+ B# w6 i! oWhen to Use Recursion * u- Z! G/ H" J- X $ t& L2 b. k& s Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort).* P, O- n- }. C
* P8 w4 ]# d/ l$ V1 @8 {7 H Problems with a clear base case and recursive case.4 V, s, Z. c. L4 X: `+ |4 V1 S2 V8 w
3 g& b6 e$ {* D6 C+ K6 L& m s1 \
Example: Fibonacci Sequence % e( R" R# a0 ?! U0 c % `, e) B3 q- T& nThe Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones:! N9 T( E+ L p8 n$ e
, V( O2 l3 v# ]9 `
Base case: fib(0) = 0, fib(1) = 1 0 E7 q3 H! k+ }! I! O% ? " x# S1 P8 ~4 U8 l8 a Recursive case: fib(n) = fib(n-1) + fib(n-2) * ?6 ~9 }; {- X k * T8 W1 b% j# z, p! q6 vpython. c0 h' ]7 @" g+ p9 w$ X
) b% Z, o' S, r6 Z9 S
" [" V/ S6 `4 [/ Z: ydef fibonacci(n):) `0 P! P5 c( Z) o
# Base cases 7 z0 D+ E! m" a* s8 ^ if n == 0: 9 j6 a/ j5 I3 T3 r e return 0, j+ X! c+ D& k3 X2 U0 U
elif n == 1: : C( a) C& N3 o/ y return 1 0 |1 M* ]& {% C4 E- ? # Recursive case2 Q4 M* u2 `, s0 e/ I* x/ Y/ q
else:3 B* M; H% ?( Z/ T4 e
return fibonacci(n - 1) + fibonacci(n - 2)2 B" l2 n+ F9 C
5 m1 E; f. D$ _4 h( f1 [# Example usage+ ~( u$ T, F) q' d% E1 \
print(fibonacci(6)) # Output: 8, w8 m7 A6 s9 V0 Y2 w
7 W3 c% x0 I3 N: J! I' z5 tTail Recursion2 V% w+ y( C1 I6 _! ]
& M9 ~+ a7 g o8 Q
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).% o0 {3 C& v" ` s3 Q' K" A
+ n! r' N5 z1 x# x& XIn 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 现在的开发流程,让一个老同志复习复习,快忘光了。