$ W$ H0 C1 M5 X! Y0 l解释的不错 3 V$ q' y7 \ p! j" [) M - \3 C8 Z+ V7 B5 [( x- @递归是一种通过将问题分解为更小的同类子问题来解决问题的方法。它的核心思想是:**函数直接或间接地调用自身**,直到满足终止条件。 8 y9 H1 l3 d/ ?8 V" H1 P3 W 0 U* ]9 F1 q' h" W 关键要素/ p* E& G8 Y1 f5 j
1. **基线条件(Base Case)** ( y) g7 ^& F) I- c9 r - 递归终止的条件,防止无限循环 ; }, o" q/ M& P% c2 a6 T - 例如:计算阶乘时 n == 0 或 n == 1 时返回 1 ' L, o) u) r" ?" Z/ M2 g$ S* g- n i% x. k- U
2. **递归条件(Recursive Case)**! r! J+ U5 c& p/ D+ G
- 将原问题分解为更小的子问题 4 k/ n A7 G8 c - 例如:n! = n × (n-1)! e! X% L4 ?$ ?) Z2 }' N& L; C
5 x* k4 {* Y7 O6 R1 G1 k" n
经典示例:计算阶乘 - `5 O+ z- A% I1 {) m# ]python ; Q. v0 w% _- `+ s; rdef factorial(n):: K* W$ Q" C3 D' G; O+ P9 N$ u |( E& X
if n == 0: # 基线条件) e+ {& {2 |9 `7 n& K
return 1 & w3 v) [" z/ L# p4 X# ?: c7 u* E else: # 递归条件4 |+ S5 E; u1 X8 k
return n * factorial(n-1) $ V' x: ~: r9 H* ]! \. g0 I% S执行过程(以计算 3! 为例):1 Q, J' d3 c4 X1 p9 j1 n
factorial(3)# k$ c5 q" z& ] U; g
3 * factorial(2)0 t& C0 m' f; p1 B
3 * (2 * factorial(1))9 m) {" _# ~% J6 r/ a
3 * (2 * (1 * factorial(0)))% C3 M* c2 W7 h+ f: T3 b' n5 Y
3 * (2 * (1 * 1)) = 6& T- `9 W; x3 H
; ~, x8 F7 [2 B% \1 K 递归思维要点4 d) b6 B3 _+ D" h* W: ~# s
1. **信任递归**:假设子问题已经解决,专注当前层逻辑 ; I$ o9 H5 z8 Z9 j$ R( u' k2. **栈结构**:每次调用都会创建新的栈帧(内存空间) 4 {& U: O. F x% @3. **递推过程**:不断向下分解问题(递) * ~4 h F) D6 s1 K4. **回溯过程**:组合子问题结果返回(归)1 I1 r2 ^* W7 ^. I+ ]& m* B
9 ^0 F. v1 I/ H! P, B# R5 Q. o
注意事项8 n) j8 d! O" P0 K! X( U8 ]
必须要有终止条件 0 o1 E* t) I+ T% ~8 z7 o! E; v- k递归深度过大可能导致栈溢出(Python默认递归深度约1000层)1 { x# n- c4 W- x6 G
某些问题用递归更直观(如树遍历),但效率可能不如迭代 - o2 i% U! `) V3 S, A1 `& {尾递归优化可以提升效率(但Python不支持) # W" m4 v+ b; g4 \ 2 D3 C# O l5 F# f* T: i+ s' b 递归 vs 迭代 * o; v' _" `1 \7 e) g0 R0 B| | 递归 | 迭代 | 1 Y) x1 ]! s: }|----------|-----------------------------|------------------|' i1 Q- c. n" y( _, w
| 实现方式 | 函数自调用 | 循环结构 | 2 P1 N2 ~9 z; n6 k R! a$ i( X. A| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 | / t1 _. \: m- \0 p| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 |. ~ x& R7 r8 Z! @
| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 | . k7 a! ~1 d# `" @$ i% R+ p& h. V8 M" I8 u: U+ d
经典递归应用场景 & U; U- p; [. ~. W1. 文件系统遍历(目录树结构) ) B, h+ |; U1 ]3 C2. 快速排序/归并排序算法+ M- Y* ]/ X7 b! j9 [% e+ U" J5 v% N! e
3. 汉诺塔问题% ?# j, T+ m& A
4. 二叉树遍历(前序/中序/后序)8 @3 a( L$ ^# q# i5 f& ?
5. 生成所有可能的组合(回溯算法) 1 C* i. d! H7 O1 s' d5 @2 ]6 e- E2 t+ ?) }! i( Q/ B
试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒,# M! x% K3 y2 s7 N& }: O9 ^
我推理机的核心算法应该是二叉树遍历的变种。 2 }( }; N% g% {+ Y7 {4 P& S另外知识系统的推理机搜索深度(递归深度)并不长,没有超过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: : H) h& v6 o% u$ |% E& i: }1 Y, A! [Key Idea of Recursion ) K. ?* \# I! ~6 {9 M- Y2 ~9 x% a/ \" w# u
A recursive function solves a problem by: / O6 p8 m& L) a1 l! Q: T9 J+ D3 u$ J' m" h: l
Breaking the problem into smaller instances of the same problem. % ^( a9 F6 {' I, t6 {5 g# { ~' Y% s4 }8 h2 }
Solving the smallest instance directly (base case).. B( @* ~' C, l Q4 H. O( a8 \( Z
# W/ p1 y2 d6 g" E3 }6 j0 q4 N: d
Combining the results of smaller instances to solve the larger problem. 4 |7 F3 _' k% b+ b. m. H! I . r, s$ g1 w9 o& kComponents of a Recursive Function% F8 X O3 i$ Y" r1 k! l7 C
$ K$ |9 T9 D4 w- i! f% ^. ?3 w
Base Case:: A5 a* }3 q" i, M
( p( t8 [2 ~7 a% ?8 D6 }! { This is the simplest, smallest instance of the problem that can be solved directly without further recursion.% w! w8 D6 n( K3 R5 I% a" w
/ Y% l: N+ A# x4 h
It acts as the stopping condition to prevent infinite recursion.# {) l! u+ b! c+ J" F9 a
* j3 S5 r: w T" K' _/ m- T" c# j Example: In calculating the factorial of a number, the base case is factorial(0) = 1. 7 Z5 O) Q3 Q% x& X1 x& R+ u$ J9 C9 j! O& u! T/ \
Recursive Case: 6 {9 k' g7 f9 i2 p& i : i# @) F# i+ v) b8 O4 y; k This is where the function calls itself with a smaller or simpler version of the problem. 4 @$ ]4 G, m$ F$ ~& } : A" y1 o0 Z z; s+ o3 W" ?5 H Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1).+ m+ O6 Z" m) y a- M. {
+ b! Z! l, H8 ^: M/ B w# R
Example: Factorial Calculation, I$ z. }0 H6 a0 T, g
3 j3 N S9 O+ h% k0 y1 i
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:$ U* L" W. h3 X- L
5 b- h3 R3 J8 J' s8 [$ w9 r' f Base case: 0! = 1) G- J+ Y' e# L- \* ~4 C/ Q+ O
* r3 b1 z' U1 z4 C Recursive case: n! = n * (n-1)! 6 Q. }4 z, l3 x9 y7 {( ~1 \" }9 ~1 a* U' t- a' _
Here’s how it looks in code (Python):1 U! x4 G+ o! D" o
python6 g4 B2 x& R1 m
( A# N/ y$ D4 e3 O1 {- j 9 g/ G9 m' \* o. X1 Udef factorial(n): 1 r" [! T6 }6 P# f # Base case " W. }/ p$ K+ m0 a4 M+ X if n == 0:1 ]& ?/ {/ {, _
return 1 , W. M7 B4 b/ m # Recursive case: D% j! R: f: S5 I( G2 W. ?3 H
else:# v. U; q. Q. p9 L. S, P
return n * factorial(n - 1) 9 |1 ^5 K4 b) r- Y6 M& p. M6 O! E6 s7 u; K9 e. G5 [
# Example usage! g' D6 b. v) X9 {
print(factorial(5)) # Output: 120 " A3 ?4 R) b' X0 ^6 ~9 | {3 @8 W" F3 H
How Recursion Works 3 K0 b! S; b. ]0 c9 I x( r) I
The function keeps calling itself with smaller inputs until it reaches the base case. 9 B7 e- y3 q* w$ ?' `4 |# L0 b/ T" E4 l8 G2 [7 S+ a9 B
Once the base case is reached, the function starts returning values back up the call stack.) i" h6 j( H# E3 m
" M% k) g5 ^' I0 B1 |
These returned values are combined to produce the final result.. R6 q9 l6 o, W0 W6 D
( d) I; O( c+ G0 r# B; r6 }For factorial(5): % |* [4 N( K( W- x& `: m$ c1 b3 _0 y& A. Y* d* n+ x; w
) ?! s6 M+ C+ O$ ] p5 i8 n
factorial(5) = 5 * factorial(4)2 N* Q2 j- F4 B3 [" x
factorial(4) = 4 * factorial(3)( X5 `9 B, m* B8 G. J1 K* i) G y. S
factorial(3) = 3 * factorial(2) # ]7 N: J q3 o3 i/ K+ X) \, afactorial(2) = 2 * factorial(1)6 Z9 Y& z7 b/ z+ ^$ q( [) w- H5 m
factorial(1) = 1 * factorial(0)* F5 H: m) J: W V7 {
factorial(0) = 1 # Base case3 p3 Q, H$ S" ^: Z9 T
c6 r% S8 k0 I+ Z. |: T6 e) n7 |
Then, the results are combined:& }# U5 p4 Z5 \6 E' l5 a
. p3 n. o& Z2 @( p- k
, D3 T; y H4 y- O9 { M2 sAdvantages of Recursion & S, t5 B6 T7 `$ T6 y2 i ; T- Z# }7 ^3 ~" Q. B0 `. e 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).- F9 O5 W; R, f ?/ _" v
3 a; M& ?# I; u2 {+ q% w
Readability: Recursive code can be more readable and concise compared to iterative solutions.( H/ M2 W5 M$ G' k4 D+ ?
2 j2 s6 k1 B# l9 H ^1 [Disadvantages of Recursion5 }! g8 _( @2 d7 W7 u$ S: g
3 ?, _$ c3 D0 F1 R. ] 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. $ Z- C7 r; c; O 1 D+ ^: m7 u$ X8 f Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization).0 j% s$ [ B3 E/ j: s
v. T* K( |1 ?/ P8 ] rWhen to Use Recursion " o) `1 R: S. q7 ^ & r" j f7 i% H! J. ^7 j Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort). + r/ a8 C7 W( U# x ; Y* f: `' [# p. x Problems with a clear base case and recursive case.. K# p" x# ^' x- O3 P2 V2 g
0 v/ y2 M8 M& x. k( Y, I; X) _
Example: Fibonacci Sequence% n: o& P( _1 m/ u7 |" t
, @) C! x, T$ t* n
The Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones: % q3 `1 `% i! B$ C5 T3 G& r) s5 `" r8 S; p
Base case: fib(0) = 0, fib(1) = 1+ T* ? ~" {; o- A
1 ~. R6 c7 x8 N2 V; Y% b
Recursive case: fib(n) = fib(n-1) + fib(n-2)/ C k( o+ l2 P8 l
/ a5 a5 w" C" j: z; q, t8 s
python ) w/ w4 A8 u$ {# A9 u2 _" {& P4 L, p/ O7 O6 J% U$ Z. Q- h
; m- L; r1 N; _- R; d }$ Ndef fibonacci(n):, W" r: K, F9 u' d8 N: {9 r
# Base cases3 w. O, c J# b" k- }" c: ]. C( _9 z
if n == 0: ) C8 h- b+ f. J `* M/ W( U& f return 0# h% A2 c: b( ^( p
elif n == 1: % V* j4 B# f* c return 1 8 c- ~$ @* o7 T% K # Recursive case . I/ I/ l% }' I8 s else: ( o! G, B+ f# o0 M9 Z2 s: \' { return fibonacci(n - 1) + fibonacci(n - 2)7 A9 j; b$ x3 ?1 @8 o& U& q
0 R0 C c5 o3 k) b8 c$ k! u
# Example usage 7 T) s# ?5 N0 }/ }print(fibonacci(6)) # Output: 8, F/ O3 v# H/ A2 s4 O
7 ~; R: f8 B9 ^- Z0 _2 ?* @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).6 H1 [! i. P* P% [2 B9 v0 Q/ i1 D4 c
; W" M/ k; T' u1 W% Y9 n) l5 k C
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 现在的开发流程,让一个老同志复习复习,快忘光了。