标题: 【跟风】编程语言的递归奥秘(长文) [打印本页] 作者: xiejin77 时间: 2025-1-20 15:42 标题: 【跟风】编程语言的递归奥秘(长文) 本帖最后由 xiejin77 于 2025-1-20 16:22 编辑 9 ~# U/ M$ ?* C. W; I1 t+ X2 r: l
9 K+ t( ?. |( C: U" Y! Z
编程语言的递归奥秘:从斐波那契数列到区块链智能合约" c( P; N. N4 |! a
1. 引子6 ?' d1 e7 I; Y( z' {
爱坛之中突然开始讨论起递归这话题。让我忍不住写了一篇长文,勉励解释一下我对于这个概念的理解。16年在努力研究比特币脚本和以太坊智能合约等区块链基础技术的过程中,也算是深入的做了一番思考。现在把整体思路整理出来,还希望爱坛的老师斧正指导。0 ?: \! O. b; t$ z/ i6 O1 N
. I. \$ g# m9 Y2 Z* Q- O" s: ?
想象一下,你正在教一个机器人做家务。你告诉它:"要整理房间,首先拿起一件物品,如果它是脏的,就把它放到洗衣篮里,然后继续整理下一件,直到所有东西都整理好。" 这其中就蕴含了一个重要的概念——递归。简单来说,递归就是指一个过程在执行过程中调用了自身。 " q6 z( Z) d5 G' s$ ]' C! K6 Z2 \ , L1 t& n7 F1 `! Z% v为了更好地理解递归,我们不妨从一个经典的例子——斐波那契数列开始。这个数列的特点是,除了前两个数字是 0 和 1 之外,后续的每个数字都是前两个数字的和:0, 1, 1, 2, 3, 5, 8, 13, ... 1 k1 J. W9 l3 Q$ N A - E% i! Y* v; q6 o! d让我们来看看如何在不同的编程语言中实现斐波那契数列的计算。 % p" s B6 C( R! O1 A* M. u 6 `* B/ `+ s7 O1 M/ _常见编程语言实现 (以 Python 为例):0 t! Y/ _6 r. k2 D3 U9 H
) c$ {: L9 e+ s. `- g" Bdef fibonacci(n): 2 |& V% a6 m5 j% ]! c& { if n <= 1: 3 N, |9 z( M- v return n / [; {4 U+ E P! I7 p, j9 u else: 3 A2 K ]7 S3 J7 ^; v4 m; x return fibonacci(n-1) + fibonacci(n-2)! }" W7 o. E f1 e
! q) F0 D' ~2 A, oprint(fibonacci(10)) # 输出 55 5 ] I9 h3 p9 N0 E+ T这段 Python 代码非常直观地展现了递归的思想:要计算 fibonacci(n),先计算 fibonacci(n-1) 和 fibonacci(n-2),然后将它们相加。9 } t; i( K* `, \- U s& d
4 n! M/ i: [* l$ P# c7 n" e
受限语言实现 (以 SQL 为例):; e- @9 V4 w- v; ~' O( \
3 C; ?! T) ?3 }. f N K( i" W
虽然 SQL 主要用于数据库查询,但一些数据库系统也支持递归查询,例如 PostgreSQL 中的 WITH RECURSIVE 语句: % R8 S# ]+ f2 s: I- p3 _! t: z, w }. T
WITH RECURSIVE Fibonacci(n, a, b) AS (* ?" s+ w% Z# O( X3 V/ D& m. Y$ h( o
SELECT 0, 0, 1 6 _/ I8 l* K2 `! j UNION ALL4 G7 v2 {& X. t6 G/ x% a
SELECT n + 1, b, a + b , C' v/ x/ p1 V0 T! g9 W1 F FROM Fibonacci " e7 o2 v3 c4 A+ {; {1 f" T. Z4 c WHERE n < 10) ~! O! \* d9 _! f" K/ p- [
) # Q; a3 e x1 y7 L4 U. BSELECT a FROM Fibonacci WHERE n = 10;$ ]3 M# B, K9 x; \4 F! {( h
这段 SQL 代码虽然看起来复杂些,但本质上也是在利用递归的思想,通过不断迭代生成斐波那契数列。$ v! P6 G' b* B i. J
5 V% R2 I3 h. y3 b' z1 i- _8 F! w实现差异引发的思考: ; n/ D4 p6 j) L1 H& J2 u Y4 S. t" M
你可能已经注意到,不同的编程语言在实现递归时,语法和方式有所不同。有些语言天然支持递归,如 Python、Java、C++ 等;而有些语言则需要通过特定的语法结构来实现,如 SQL。这背后引出了一个更深层次的问题:& @5 D5 E& R6 n! J1 r6 `1 M
) A9 j! ^/ O; k0 {2 l7 ~% j j( \1 I
核心问题提出:6 M8 t# x+ c, y4 [! k% u
: N7 ^# m& e+ Z7 s. @
支持递归的编程语言就一定是图灵完备的吗? ; t1 y5 x! o0 ?% q+ i为什么我们需要关注编程语言的图灵完备性? ; |$ E# k8 s2 v0 V$ c; o这些问题看似高深,但实际上与我们的现实生活息息相关,尤其是在区块链技术兴起的今天。 Y, E0 N7 G& c6 m$ ]3 a