! Q3 o8 s5 k' R+ }* v! q& V, |解释的不错 & |' e: B! t- [7 b" T: f 7 g5 {( _2 \3 j, X递归是一种通过将问题分解为更小的同类子问题来解决问题的方法。它的核心思想是:**函数直接或间接地调用自身**,直到满足终止条件。 4 S) Q7 }4 q3 y! n2 y0 p. r; x' m % G6 x. P' m+ j$ m 关键要素 : ^* U) d6 P$ v3 v9 }9 x1. **基线条件(Base Case)** - z5 N8 p% e) e" S) k6 v3 ~5 J7 t - 递归终止的条件,防止无限循环 2 `0 f9 }9 m3 c5 M' |& V1 E - 例如:计算阶乘时 n == 0 或 n == 1 时返回 1" ~. j+ \$ A. P$ ~" u5 s: {, Y6 ^
$ V6 S& _; ~ O/ \2. **递归条件(Recursive Case)** R) K% f5 @4 |0 A& X5 R
- 将原问题分解为更小的子问题' S, u$ v' u p5 j* l9 S
- 例如:n! = n × (n-1)!: E9 z4 B9 E- H2 z$ b) o
1 q/ ?$ l6 j# I! E3 J+ K3 l" d U 经典示例:计算阶乘3 G1 O8 e3 G5 V
python+ o# \2 E) M! `2 O+ Z& |. U0 M
def factorial(n):' _9 |' s& @2 p u
if n == 0: # 基线条件2 f7 v4 \* C0 {( M6 d4 }& @
return 1 * x4 t# S8 N6 Q3 n R else: # 递归条件 - J4 C/ X7 h6 ?4 K: ^( m- ^4 H, l1 ] return n * factorial(n-1) 8 J3 H2 @0 e$ Q1 Q执行过程(以计算 3! 为例):( k3 o* z y% W* m5 `# n5 \% p, K# n
factorial(3) ; `8 B3 N6 ?( L, M% m' W3 * factorial(2)5 N# T/ H" [, h, r
3 * (2 * factorial(1))% e* H) ?% V6 Y0 @
3 * (2 * (1 * factorial(0))) ( F2 F: E O, h# T; Y! w* |3 * (2 * (1 * 1)) = 6 / K9 j' [( Y) ^8 `& b& B1 Y2 f, s/ d' C, ^9 L
递归思维要点8 u# {2 a; [0 N9 B! x1 r" u
1. **信任递归**:假设子问题已经解决,专注当前层逻辑 ! z, i2 u) ^# h2. **栈结构**:每次调用都会创建新的栈帧(内存空间) ! q6 e. d2 i4 o) ]$ ?3. **递推过程**:不断向下分解问题(递) 8 g8 t8 ?) [2 P4. **回溯过程**:组合子问题结果返回(归)6 E# g9 x ~: R1 Q; e9 {
0 C* ?# S) u$ X( W
注意事项$ e+ V9 {& ^: C( H8 |
必须要有终止条件 : a$ s- B8 @+ ]: y( C递归深度过大可能导致栈溢出(Python默认递归深度约1000层) 9 e/ T! `) G+ ^7 R# v某些问题用递归更直观(如树遍历),但效率可能不如迭代 ( V5 s8 p I. l# p" |尾递归优化可以提升效率(但Python不支持)' K/ _# T% U' ~% y/ q: g% T
# r' {! V% e- U3 M
递归 vs 迭代: n1 J0 a. F V5 n R
| | 递归 | 迭代 | 1 m9 j# ]" `5 f|----------|-----------------------------|------------------| / G& @& N' y) E+ E$ u+ g. B" }% ?( V| 实现方式 | 函数自调用 | 循环结构 |2 C' S8 W( I* d7 C
| 内存消耗 | 需要维护调用栈(可能溢出) | 通常更节省内存 |; S) }4 [9 j( A2 L, O# P$ P
| 代码可读性 | 对符合递归思维的问题更直观 | 线性流程更直接 |7 T7 k! _) Q4 w9 u8 `
| 适用场景 | 树结构、分治算法、回溯问题等 | 简单重复操作 |- U: T; r9 p3 g
3 Q6 v8 I& B/ s/ J 经典递归应用场景$ o7 s" W* l( u6 c# y
1. 文件系统遍历(目录树结构) - J# ]3 @, o/ q2. 快速排序/归并排序算法+ m! w0 H: F6 r; N' i
3. 汉诺塔问题 2 S' ?' S/ ^2 J4. 二叉树遍历(前序/中序/后序)5 D! O: L' Y1 [
5. 生成所有可能的组合(回溯算法)7 A$ P/ [ {: F5 O+ j* s& g7 u* a
- h' }2 v9 p& s! v/ K' |; ^/ [试着用递归思维想象:你站在一面镜子前,镜子里有无数个逐渐变小的你在照镜子,这就是递归的直观体现。但记住每个"分身"最终都要有结束的时刻,这就是基线条件的重要性。作者: testjhy 时间: 2025-1-30 00:07
挺好,递归思维要点与我能够回忆起来我当时写递归程序的思路很一致,,或者被它唤醒,. O: X3 o! O' ? |9 F% D4 E; o" u
我推理机的核心算法应该是二叉树遍历的变种。 . f$ X7 Z$ T4 N# 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: 3 V/ m% v2 H# j- I4 tKey Idea of Recursion) k& A% E2 M1 U4 m; g" d7 J
M5 A8 ^$ O) N1 l! x' D
A recursive function solves a problem by:! V- Q! q0 |0 Y ~# c7 }# Z
" E, r% h- G$ P) H Breaking the problem into smaller instances of the same problem.% ?7 a! N7 w) O! w4 x9 o; Y6 ]
3 R# @9 b4 Q" a. ^5 e, ^
Solving the smallest instance directly (base case). 5 D# [: y7 A7 K! I. d7 u* m* u+ m7 q* J1 M. t1 m' r1 C6 \- d
Combining the results of smaller instances to solve the larger problem. $ ]0 U! ^% n: t: R9 a9 m3 ~! a! V3 `0 o
Components of a Recursive Function' z9 z1 w/ \6 p2 _& w( z; q
# D0 y5 b6 s) H3 _* N4 `0 Z Base Case: ) Y1 V( V% J) Y1 w# p, ?! P: f0 i/ E6 H5 P3 f3 c/ u O0 H% k0 X& F0 F. D
This is the simplest, smallest instance of the problem that can be solved directly without further recursion. 5 F* q: e4 [7 I$ Y+ S- w c ( R4 E( G j) d1 j" E It acts as the stopping condition to prevent infinite recursion., `. S a+ x) ]% i. x6 r+ U
/ ]/ |/ F: {9 F1 q* X L6 } Example: In calculating the factorial of a number, the base case is factorial(0) = 1. 1 @$ I, n4 m+ Q. b( p+ L8 U @% q
Recursive Case: 2 j7 J3 b d! a8 M+ M1 H) k; ^6 L( c7 ]0 t; m6 l" M
This is where the function calls itself with a smaller or simpler version of the problem. - m( y* Y5 j x0 C) V0 [* h 9 g) b2 p) N7 R8 x) o* P/ F Example: For factorial, the recursive case is factorial(n) = n * factorial(n-1).! i) }( p$ K! q/ v2 ]& X2 q \ z
, X3 S8 {/ o. c/ z1 d( R" |5 w8 q" ]Example: Factorial Calculation9 m/ h8 P- \# z" w1 m( s' D4 f
/ U8 R" m. K5 ~# Z; E& n
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:& u4 A/ ?2 w) J' G6 j. b
; m7 E3 o7 T8 m' Y$ C2 [0 `
Base case: 0! = 1 % t$ P( H" l! K- F2 C' _ # h3 D: e8 s& m) a7 e Recursive case: n! = n * (n-1)! . O' S# t% }' T. Y0 w' o( _ ^: ]# o' e3 [
Here’s how it looks in code (Python): 6 D' T- d/ m- q3 n; y* Mpython F. g' `8 o, {1 _6 E
2 n2 A' m$ X; U J( E 3 M( G6 A( O2 ]. k0 ~) h: Udef factorial(n): a* R8 z7 c! Q$ W
# Base case% p$ B. v# z% l6 a$ Q3 ?: X6 N
if n == 0: ) ?' p( |6 k' K1 F, F return 1# `/ w3 |) i$ ?: e) G: Z
# Recursive case : K, { P+ E- n; U else: , r) I% J N3 C return n * factorial(n - 1) ) z) k1 r9 e% u( f* j3 K! k2 C4 A5 \! S i) U3 B
# Example usage/ s1 s% H0 G4 ~( P/ }' {7 a
print(factorial(5)) # Output: 120! T. f0 p9 N7 D0 p4 k
4 g' P1 R: I+ B* [5 ~# l1 ]2 ~
How Recursion Works; E" J9 e) g; Z% P
! n" R" Q; A4 e$ B$ v0 E. m The function keeps calling itself with smaller inputs until it reaches the base case.2 z: I1 A5 E/ {2 w' o
. p9 K0 ^- ? W2 c% b. f( M6 R! x
Once the base case is reached, the function starts returning values back up the call stack.6 N7 E" x7 D5 B# S5 J
1 w$ o8 n: I, M$ t v These returned values are combined to produce the final result. h( n: X- L6 e# A8 S+ c. H- _ * b8 b1 {/ ~5 DFor factorial(5): . z8 K1 \ z5 }0 I 6 N( h t, Q* W1 V& m6 A6 U 3 a9 T6 \/ t3 Z# B1 {% Ffactorial(5) = 5 * factorial(4)( ^/ a; L+ K0 `3 g; {! V
factorial(4) = 4 * factorial(3) $ Q8 l7 \ P% D1 S6 {& V% {factorial(3) = 3 * factorial(2) # A- O0 g$ o+ `4 H$ jfactorial(2) = 2 * factorial(1)7 r3 N! Z& B' m8 u6 J* ^1 q
factorial(1) = 1 * factorial(0) 0 E7 B2 l& U* P5 L. Tfactorial(0) = 1 # Base case ) C8 Z: ~& B5 ?7 J4 T8 J1 P4 e6 l2 a. Y8 T* p$ o9 @. O0 l
Then, the results are combined: , a" E2 `! H$ w" m+ v/ A8 D6 u2 F. m) U
/ C4 r5 p. D5 J) e
factorial(1) = 1 * 1 = 1 / S) w3 u' b/ F3 n4 ]% v8 R8 bfactorial(2) = 2 * 1 = 2 1 }; U" L0 D, Pfactorial(3) = 3 * 2 = 6. ~6 L, k1 [# _! e. v
factorial(4) = 4 * 6 = 241 a* F3 v" C* {1 X
factorial(5) = 5 * 24 = 120 7 T% T+ v! M* A) J7 Y: q# Z ' H4 ~- }9 c/ {/ [( ~1 z( Y& KAdvantages of Recursion- S' Q, A% C9 r
/ g% n4 p' a* f: N9 N7 L
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). ' j$ X4 H( U0 x2 b6 @1 D0 e4 W& N# k' Q. c4 G
Readability: Recursive code can be more readable and concise compared to iterative solutions.3 F, Q! }8 A% i: O2 b) h
1 I1 f. V4 h# L
Disadvantages of Recursion : B3 {$ Y2 s' r. s: l5 p 5 L1 a) C& f# a; W; L3 V 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. ; B7 n4 \( @% F+ j . Z9 K# c3 Y. U2 n4 T# m Inefficiency: Some problems can be solved more efficiently using iteration (e.g., Fibonacci sequence without memoization). $ E5 q% k. H& j8 i. K* b R( s 7 Y" M# N7 Z% J! k; h$ TWhen to Use Recursion % z# Z& d/ ^; W) r, o2 l1 h" l# i( c3 r/ \( \; G9 V
Problems that can be broken down into smaller, similar subproblems (e.g., tree traversals, sorting algorithms like quicksort and mergesort). $ @; k: f# m* J) i: @4 n2 B/ t8 Z) w* O7 p. r/ G
Problems with a clear base case and recursive case. ! \% P( Q$ A6 K J, f4 p V8 d* R3 K- O+ G" O
Example: Fibonacci Sequence , m: Z1 I- l/ T$ Z& A3 | / R3 |: Y- x1 L3 N4 R ?The Fibonacci sequence is another classic example of recursion. Each number is the sum of the two preceding ones: % Y8 _# t0 } ` m3 H$ {# l3 z; x# b, z
Base case: fib(0) = 0, fib(1) = 14 I' t; {" W5 T: J7 }, T1 W; m6 \
( q7 q4 L! c" s Recursive case: fib(n) = fib(n-1) + fib(n-2) " [* F8 d% g5 R: k; I + K5 K: i; r, e, L$ jpython/ t* b+ G( O f" m( v, m
1 p& S# l- @ q) U0 G% u7 v- g' g1 h
, N5 O% X$ ]) m4 pdef fibonacci(n): o+ \- Y% W: p3 u5 P7 O) Y
# Base cases& I6 k. l I% G
if n == 0: ) y T+ z0 Y0 a ?+ @ return 0/ j, u& B: ]$ X
elif n == 1:0 c7 r' Y3 Y+ C( L6 f% d: [
return 1 - Q* g5 G! i' U+ ? # Recursive case F# P2 J6 x% g else:3 J0 l) @6 I: T9 ^( W6 A! _: t
return fibonacci(n - 1) + fibonacci(n - 2)! c- U* u% x( L- U
$ R% B( ]0 x- y4 a8 U# Example usage! [( _: o# n" Z9 |3 R
print(fibonacci(6)) # Output: 8 ; E! b" i: X$ U2 J. ]/ c1 Q/ Q* b9 D
Tail Recursion ) G5 J( a; A5 u/ u" F0 K2 X! L: w' s9 v, v, V
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). 9 G* `; L( R7 h- U. \% g0 t 2 Q( n: N6 y6 z: l0 DIn 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 现在的开发流程,让一个老同志复习复习,快忘光了。