当前位置:首页>python>汉诺塔的递归之美:用Python让程序员玩到“发疯”的经典游戏

汉诺塔的递归之美:用Python让程序员玩到“发疯”的经典游戏

  • 2026-01-14 12:59:33
汉诺塔的递归之美:用Python让程序员玩到“发疯”的经典游戏

递归,是编程世界里最优雅也最“反直觉”的算法思想,无数程序员初学时被它绕得晕头转向,甚至直呼“发疯”。而汉诺塔(Hanoi Tower),正是递归算法的「终极教学案例」,没有之一。它将「分治思想」与「递归逻辑」完美融合,寥寥数行代码就能实现看似无比复杂的游戏规则,层层拆解的过程,藏着编程最极致的逻辑之美。

汉诺塔的规则简单到极致,实现却精妙到震撼:三根柱子,一堆从小到大叠放的圆盘,要求把圆盘从起点柱全部移到终点柱,过程中只能移动最顶端的一个圆盘、且永远不能让大圆盘压在小圆盘上。就是这个看似简单的游戏,当圆盘数量增加到64个时,传说中需要耗尽宇宙寿命才能完成所有移动,其背后的核心,正是递归的「自相似性」与「拆解智慧」。

本文将彻底吃透汉诺塔的精髓:从游戏规则到递归思想,从分治拆解到代码实现,再到可视化的完整游戏演示。全程无晦涩难懂的概念,用最通俗的语言讲透递归的核心逻辑,最后用Python实现「带详细步骤打印+可视化圆盘分布」的完整汉诺塔游戏,让你直观感受递归的拆解力量,看懂递归的底层逻辑,从此不再惧怕递归算法!

一、初识汉诺塔:规则极简,却藏着递归的灵魂

汉诺塔的经典规则(3个核心,牢记)

汉诺塔源于印度古老的传说,游戏的核心元素只有 3根柱子 和 n个大小不同的圆盘,标准游戏规则只有3条,简单到小学生都能看懂:

  1. 有三根柱子,我们命名为:源柱(A)辅助柱(B)目标柱(C)
  2. 初始状态:所有圆盘从小到大、自上而下叠放在源柱A 上,最大的圆盘在最底部,最小的在最顶部;
  3. 移动规则:
    • 每次只能移动1个圆盘,且只能移动某根柱子最顶端的圆盘;
    • 移动过程中,任何时刻都不能让大圆盘压在小圆盘上
    • 最终目标:把源柱A上的所有圆盘,完整无损地全部移动到目标柱C上。

为什么汉诺塔是递归的“最佳代言人”?

汉诺塔的游戏逻辑,完美契合递归算法的 核心特征一个复杂的大问题,可以拆解为多个结构相同的小问题,小问题的解决方式和大问题完全一致,直到拆解到「最小子问题」时,能直接给出答案

这种「大问题拆小问题,小问题同逻辑」的思路,就是递归的灵魂,也是「分治思想」的核心。

  • 递归的本质:自己调用自己,解决局部问题,汇总得到全局解
  • 汉诺塔的本质:移动n个圆盘的问题,拆解为移动n-1个圆盘的问题,无限拆解直到只剩1个圆盘。

 先从最简单的情况入手:看懂递归的“最小子问题”

递归的核心难点是「跳出循环思考的惯性」,学会「从后往前看、从简单到复杂」。我们先从最小的圆盘数量开始分析,找到规律,这是理解所有递归问题的通用技巧。

情况1:只有 1 个圆盘(n=1)

这是汉诺塔的「最小子问题」,也是递归的递归出口(终止条件),答案一目了然:

直接把圆盘从源柱A 移动到 目标柱C 即可,仅需 1步

情况2:有 2 个圆盘(n=2)

两个圆盘,大小为「小圆盘1、大圆盘2」,此时需要借助辅助柱B,共需 3步 完成,逻辑清晰:

  1. 把小圆盘1 从 A → B (源柱→辅助柱,腾出大圆盘);
  2. 把大圆盘2 从 A → C (源柱→目标柱,大圆盘归位);
  3. 把小圆盘1 从 B → C (辅助柱→目标柱,完成全部移动)。

情况3:有 3 个圆盘(n=3)

三个圆盘,大小为「1<2<3」,此时你会发现神奇的规律:移动3个圆盘的问题,本质就是先解决「移动2个圆盘」的小问题,共需 7步 完成,核心逻辑如下:

  1. 先把顶部的「2个小圆盘」从 A → B (借助C做辅助柱),这一步就是完整的「n=2的汉诺塔问题」;
  2. 把最底部的「最大圆盘3」从 A → C ,一步到位,大圆盘归位;
  3. 再把辅助柱B上的「2个小圆盘」从 B → C (借助A做辅助柱),这一步又是完整的「n=2的汉诺塔问题」。

 规律显现:递归的核心公式(重中之重)

从n=1、n=2、n=3的情况,我们能推导出汉诺塔的通用递归规律,这也是所有代码的核心逻辑,务必刻进心里:

要把 n 个圆盘从 源柱X 借助 辅助柱Y 移动到 目标柱Z,只需要三步:

  1. 递归:把 n-1个圆盘 从 X 借助 Z 移动到 Y (先挪走所有小圆盘,腾出最大圆盘);
  2. 移动:把 第n个最大圆盘 从 X 直接移动到 Z (最大圆盘归位,永远不再移动);
  3. 递归:把 n-1个圆盘 从 Y 借助 X 移动到 Z (把剩下的小圆盘挪到目标柱,完成整体移动)。

而递归的终止条件,就是当 n=1 时,直接移动即可。

这个规律,完美诠释了「分治思想」:把移动n个圆盘的大问题,拆解成两个移动n-1个圆盘的小问题,再加上一步简单的移动。而每个n-1的小问题,又能继续拆解,直到n=1时触底反弹,完成所有步骤。

同时我们还能发现汉诺塔的步数规律:n个圆盘需要的移动步数 = 2n12^n - 12n1 。

  • n=1 → 1步,n=2 →3步,n=3→7步,n=4→15步,n=5→31步...
  • 当n=64时,步数是 26412^{64}-12641,这是一个天文数字,也是传说中“耗尽宇宙寿命”的由来。

二、递归的核心认知:理解递归,先打破思维惯性

很多程序员惧怕递归,不是因为递归难,而是因为习惯了「循环的正向思维」,却无法适应递归的「逆向拆解思维」。结合汉诺塔,我们先讲透递归的两个核心知识点,这是看懂所有递归代码的前提,理解后,汉诺塔的代码会变得无比简单。

 递归的两大核心要素(缺一不可)

任何一个能运行的递归函数,都必须包含 两个核心要素,缺少任何一个,要么逻辑错误,要么程序卡死(无限递归)。这两个要素,在汉诺塔的递归实现中体现得淋漓尽致:

1. 递归终止条件(递归出口)

这是递归的「刹车」,告诉程序:当问题拆解到最小规模时,无需再递归调用自己,直接给出答案即可。

  • 汉诺塔的终止条件:if n == 1,此时直接移动圆盘,结束当前递归分支。
  • 作用:防止函数无限调用自己,导致栈溢出、程序崩溃。

2. 递归调用关系(递推公式)

这是递归的「核心逻辑」,告诉程序:如何把当前的大问题,拆解为更小的同类型问题,通过调用自己来解决。

  • 汉诺塔的递推公式:移动n个圆盘 = 移动n-1个圆盘 + 移动1个圆盘 + 移动n-1个圆盘。
  • 作用:实现「大问题拆小问题」的核心逻辑,是递归的灵魂所在。

递归的“递”与“归”:汉诺塔的完整执行流程

递归的英文是 recursion,拆解开来就是「递下去,归回来」,这也是递归函数的完整执行流程,汉诺塔的递归过程,就是最经典的演示:

  1. 递下去(层层拆解)
    :要解决n个圆盘的问题,先去解决n-1个的问题;要解决n-1个的问题,先去解决n-2个的问题...直到拆解到n=1的终止条件。
  2. 归回来(层层解决)
    :当n=1时,直接移动圆盘,完成最小子问题;然后返回上一层,解决n=2的问题;再返回上一层,解决n=3的问题...直到返回最顶层,解决n个圆盘的大问题。

一句话总结递归的本质:递归是「先拆解问题到最小粒度,再从最小粒度开始解决,逐步汇总答案」,就像剥洋葱,先一层层剥开,再一层层合拢。

三、趣味实战:Python实现可视化汉诺塔(完整可运行,含详细步骤)

终于到了实战环节!我们将编写两个版本的汉诺塔Python代码,由浅入深、层层递进,所有代码无第三方库,纯原生实现,可直接复制运行,兼顾「简洁优雅」和「可视化直观」,满足不同的学习需求:

  1. 基础优雅版
    :纯递归实现汉诺塔,打印每一步的详细移动过程,仅需10行核心代码,极致体现递归的简洁之美;
  2. 进阶可视化版
    :在基础版的基础上,增加「圆盘分布可视化」功能,每移动一步,就打印出三根柱子当前的圆盘堆叠状态,直观看到圆盘的移动轨迹,彻底看懂递归的执行过程!

核心约定(两个版本通用)

为了统一逻辑,我们对游戏的三根柱子做固定命名,所有代码均遵循此约定:

  • source
    :源柱,初始存放所有圆盘的柱子,默认用字符 A 表示;
  • helper
    :辅助柱,用于中转圆盘的柱子,默认用字符 B 表示;
  • target
    :目标柱,最终要把圆盘全部移动到的柱子,默认用字符 C 表示;
  • 圆盘编号:从小到大依次为 1,2,3,...,n,数字越小,圆盘越小。

版本一:基础优雅版 - 纯递归实现,打印详细移动步骤(核心必学)

这是汉诺塔的「标准递归实现」,核心代码只有 10行,完美诠释了递归的简洁之美。代码中没有任何复杂逻辑,完全遵循我们前文推导的「三步递归规律」,是所有程序员必须熟记的经典代码!

defhanoi(n, source, helper, target, step=0):
"""
汉诺塔递归核心函数
    :param n: 待移动的圆盘数量
    :param source: 源柱
    :param helper: 辅助柱
    :param target: 目标柱
    :param step: 记录移动步数
    :return: 总移动步数
    """

递归终止条件:只有1个圆盘,直接从源柱移到目标柱
if n == 1:
        step += 1
print(f"【第{step}步】将圆盘{n}{source}{target}")
return step

递归1:把n-1个圆盘从源柱借助目标柱移动到辅助柱
    step = hanoi(n-1, source, target, helper, step)

移动:把第n个最大圆盘,从源柱直接移动到目标柱
    step += 1
print(f"【第{step}步】将圆盘{n}{source}{target}")

递归2:把n-1个圆盘从辅助柱借助源柱移动到目标柱
    step = hanoi(n-1, helper, source, target, step)

return step

主程序运行
if __name__ == "__main__":
自定义圆盘数量,建议先从3开始测试,再逐步增加
    disk_num = 3
print(f"===== 开始汉诺塔游戏,圆盘数量:{disk_num} =====")
    total_step = hanoi(disk_num, "A""B""C")
print(f"===== 游戏结束!总移动步数:{total_step} =====")

运行效果(disk_num=3)

===== 开始汉诺塔游戏,圆盘数量:3 =====
【第1步】将圆盘 1 从 A → C
【第2步】将圆盘 2 从 A → B
【第3步】将圆盘 1 从 C → B
【第4步】将圆盘 3 从 A → C
【第5步】将圆盘 1 从 B → A
【第6步】将圆盘 2 从 B → C
【第7步】将圆盘 1 从 A → C
===== 游戏结束!总移动步数:7 =====

这个结果和我们前文推导的n=3的7步完全一致,每一步的移动都清晰可见,递归的拆解逻辑完美落地!


版本二:进阶可视化版 - 带圆盘分布可视化,直观看懂递归(强烈推荐)

这个版本是基础版的「增强版」,也是本文的核心实战代码。在保留「详细步骤打印」的基础上,新增了 实时可视化圆盘分布 的功能:我们用Python的字典来模拟三根柱子的圆盘堆叠状态,每移动一步,就更新柱子的圆盘分布,并打印出当前的游戏画面。

你可以清晰地看到:每一步移动后,三根柱子上的圆盘是如何变化的,大圆盘永远不会压在小圆盘上,递归的「递」与「归」过程直观呈现,从此递归不再是抽象的概念,而是看得见、摸得着的逻辑!

完整可运行代码(注释详细,直接复制)

defhanoi_visual(n, source, helper, target):
"""
可视化版汉诺塔递归函数:打印移动步骤 + 实时圆盘分布
    :param n: 圆盘数量
    :param source: 源柱
    :param helper: 辅助柱
    :param target: 目标柱
    """

初始化柱子:用字典存储,键=柱子名,值=圆盘列表(列表头部=柱顶,尾部=柱底)
    towers = {source: list(range(n, 0, -1)), helper: [], target: []}
    step = 0记录移动步数

defmove_disk(n, from_tower, to_tower, via_tower):
nonlocal step
递归终止条件:移动1个圆盘
if n == 1:
取出源柱的最顶端圆盘,放到目标柱
            disk = towers[from_tower].pop()
            towers[to_tower].append(disk)
            step += 1
打印移动步骤
print(f"【第{step}步】将圆盘{disk}{from_tower}{to_tower}")
打印当前柱子的圆盘分布(可视化)
            print_towers(towers)
return

递归1n-1个圆盘从源柱辅助柱,借助目标柱
        move_disk(n-1, from_tower, via_tower, to_tower)
移动:最大圆盘从源柱目标柱
        disk = towers[from_tower].pop()
        towers[to_tower].append(disk)
        step += 1
print(f"【第{step}步】将圆盘{disk}{from_tower}{to_tower}")
        print_towers(towers)
递归2n-1个圆盘从辅助柱目标柱,借助源柱
        move_disk(n-1, via_tower, to_tower, from_tower)

defprint_towers(towers):
"""打印当前三根柱子的圆盘分布,可视化展示"""
print("-" * 30)
for tower_name, disks in towers.items():
print(f"柱子{tower_name}{disks}")
print("-" * 30 + "\n")

打印游戏初始状态
print(f"===== 汉诺塔游戏开始,圆盘数量:{n} =====")
print("【初始状态】")
    print_towers(towers)
启动递归移动
    move_disk(n, source, target, helper)
打印游戏结束信息
print(f"===== 游戏结束!共移动{step} =====")

主程序运行
if __name__ == "__main__":
自定义圆盘数量,建议测试:34,体验递归的魅力
    disk_number = 3
调用可视化汉诺塔函数,源柱A,辅助柱B,目标柱C
    hanoi_visual(disk_number, "A""B""C")

运行效果(disk_num=3,可视化直观震撼)

运行后,控制台会打印「每一步移动+每一步的圆盘分布」,比如初始状态是柱子A: [3,2,1],柱子B和C为空;每移动一步,圆盘就会在柱子间转移,最终所有圆盘都堆叠到柱子C上,完整无缺。

核心可视化效果:柱子X: [圆盘列表],列表中的元素就是圆盘的堆叠状态,列表的最后一个元素是柱底,第一个元素是柱顶,完美模拟真实的汉诺塔堆叠逻辑。

四、核心解析:读懂代码,吃透递归的底层逻辑

汉诺塔的代码看似简单,但每一行都藏着递归的核心逻辑,我们拆解两个版本的核心要点,看懂这几点,递归的大门就彻底为你打开

要点1:递归函数的参数为什么要传递「三根柱子」?

这是初学者最困惑的点:为什么递归调用时,要把 source, helper, target 的顺序调换?
答案很简单:递归的每一层,三根柱子的「角色」都在发生变化

  • 第一层递归:要把n个圆盘从A→C,借助B,此时A是源柱、B是辅助柱、C是目标柱;
  • 第二层递归:要把n-1个圆盘从A→B,借助C,此时A还是源柱、C变成了辅助柱、B变成了目标柱;
  • 第三层递归:要把n-2个圆盘从B→C,借助A,此时B是源柱、A是辅助柱、C是目标柱。

递归的过程中,柱子的「源、辅、目」角色是动态切换的,而参数的传递,正是为了告诉每一层递归:当前这一层,谁是源、谁是辅、谁是目。这也是递归的「自适应性」体现。

要点2:为什么递归代码能实现如此复杂的移动逻辑?

汉诺塔的递归代码只有十几行,却能实现n个圆盘的所有移动步骤,这正是递归的「魔力」所在:程序员只需要定义「大问题拆小问题的规则」,不需要关心每一步具体怎么移动,剩下的交给递归自己处理

对比循环实现的汉诺塔:需要手动记录每一步的移动规则,代码冗长且逻辑复杂,动辄上百行;而递归实现,只需要遵循「分治思想」,定义好终止条件和递推关系,代码简洁到极致。

核心感悟:递归是「站在上帝视角解决问题」,程序员只需要制定规则,不需要关注细节;循环是「站在执行者视角解决问题」,需要手动规划每一步的执行流程。

 要点3:可视化版本的核心技巧

可视化版本的核心是用字典模拟柱子的圆盘分布,towers[from_tower].pop() 取出柱顶圆盘,towers[to_tower].append(disk) 放入目标柱,这两个操作完美模拟了「移动最顶端圆盘」的规则。而 nonlocal step 是为了在嵌套函数中修改外层函数的变量,实现步数的累加。

五、递归的延伸思考:汉诺塔教会我们的编程思维

汉诺塔不仅仅是一个游戏,更是一堂深刻的编程思维课。通过汉诺塔理解递归,你会收获远超算法本身的思维能力,这些能力会贯穿你的整个编程生涯:

 1. 递归的核心是「分治思想」:化繁为简,以简驭繁

编程中遇到复杂问题时,最有效的解决思路就是「分治」:把一个大问题拆解为多个结构相同的小问题,小问题解决了,大问题自然就解决了。汉诺塔是这样,快速排序、归并排序是这样,二叉树的遍历也是这样。

 2. 递归的本质是「信任」:相信递归函数能解决子问题

递归的最大难点,是「不敢相信自己写的函数能解决子问题」。很多初学者会陷入「逐行追踪递归执行流程」的误区,试图看清每一层递归的调用细节,结果越追越晕。

正确的做法是:只要定义好了终止条件和递推关系,就大胆相信递归函数能解决当前的子问题。就像汉诺塔,你不需要关心n-1个圆盘是怎么移动的,只需要知道「调用递归函数就能完成这个移动」,剩下的交给递归即可。这就是编程中的「抽象能力」。

3. 递归与循环的取舍:优雅与效率的平衡

递归的代码简洁优雅,但递归调用会产生函数调用栈,消耗更多的内存,效率略低于循环;循环的代码效率高,但逻辑复杂,可读性差。

在实际开发中:

  • 对于小规模的问题(如汉诺塔n≤20),递归是最优选择,代码简洁易维护;
  • 对于大规模的问题(如n>1000),可以用循环模拟递归(尾递归优化),避免栈溢出。

但对于程序员来说,先掌握递归的逻辑,再考虑优化效率,永远是正确的学习顺序。

六、总结:递归之美,是逻辑的极简与优雅

汉诺塔的递归实现,是编程世界里最经典的「少即是多」的案例:寥寥数行代码,承载着无比复杂的逻辑;看似简单的递归调用,拆解出千变万化的移动步骤。

从n=1的简单移动,到n=64的天文数字,汉诺塔的递归逻辑从未改变。这种「以不变应万变」的智慧,正是递归的精髓,也是编程的魅力。递归不是洪水猛兽,也不是炫技的技巧,而是一种「化繁为简」的思维方式,一种「看透问题本质」的能力。

当你能看懂汉诺塔的递归代码,能理解每一步的拆解逻辑,你会发现:那些曾经让你头疼的递归问题(二叉树遍历、阶乘、斐波那契数列),都变得无比简单。因为它们都遵循着同一个核心逻辑:大问题拆小问题,小问题同逻辑,触底反弹归答案

最后,送给所有程序员一句话:递归的美,不在于代码的简洁,而在于它教会我们:学会拆解问题,学会信任逻辑,学会用极简的规则,解决极致复杂的问题

从此,汉诺塔不再是让程序员“发疯”的游戏,而是你理解递归、掌握分治思想的最佳伙伴。不妨修改代码中的圆盘数量,从3到4,再到5,感受递归的拆解力量,感受编程的逻辑之美!

最新文章

随机文章

基本 文件 流程 错误 SQL 调试
  1. 请求信息 : 2026-02-09 06:20:23 HTTP/2.0 GET : https://f.mffb.com.cn/a/462299.html
  2. 运行时间 : 0.157531s [ 吞吐率:6.35req/s ] 内存消耗:4,726.55kb 文件加载:140
  3. 缓存信息 : 0 reads,0 writes
  4. 会话信息 : SESSION_ID=6bd7ea5838f1ddf492b718edf15a05dc
  1. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/public/index.php ( 0.79 KB )
  2. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/autoload.php ( 0.17 KB )
  3. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_real.php ( 2.49 KB )
  4. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/platform_check.php ( 0.90 KB )
  5. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/ClassLoader.php ( 14.03 KB )
  6. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/composer/autoload_static.php ( 4.90 KB )
  7. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper.php ( 8.34 KB )
  8. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/helper.php ( 2.19 KB )
  9. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/helper.php ( 1.47 KB )
  10. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/stubs/load_stubs.php ( 0.16 KB )
  11. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Exception.php ( 1.69 KB )
  12. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Facade.php ( 2.71 KB )
  13. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/deprecation-contracts/function.php ( 0.99 KB )
  14. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap.php ( 8.26 KB )
  15. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/polyfill-mbstring/bootstrap80.php ( 9.78 KB )
  16. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/Resources/functions/dump.php ( 1.49 KB )
  17. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-dumper/src/helper.php ( 0.18 KB )
  18. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/symfony/var-dumper/VarDumper.php ( 4.30 KB )
  19. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/App.php ( 15.30 KB )
  20. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-container/src/Container.php ( 15.76 KB )
  21. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/container/src/ContainerInterface.php ( 1.02 KB )
  22. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/provider.php ( 0.19 KB )
  23. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Http.php ( 6.04 KB )
  24. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Str.php ( 7.29 KB )
  25. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Env.php ( 4.68 KB )
  26. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/common.php ( 0.03 KB )
  27. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/helper.php ( 18.78 KB )
  28. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Config.php ( 5.54 KB )
  29. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/app.php ( 0.95 KB )
  30. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cache.php ( 0.78 KB )
  31. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/console.php ( 0.23 KB )
  32. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/cookie.php ( 0.56 KB )
  33. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/database.php ( 2.48 KB )
  34. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Env.php ( 1.67 KB )
  35. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/filesystem.php ( 0.61 KB )
  36. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/lang.php ( 0.91 KB )
  37. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/log.php ( 1.35 KB )
  38. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/middleware.php ( 0.19 KB )
  39. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/route.php ( 1.89 KB )
  40. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/session.php ( 0.57 KB )
  41. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/trace.php ( 0.34 KB )
  42. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/config/view.php ( 0.82 KB )
  43. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/event.php ( 0.25 KB )
  44. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Event.php ( 7.67 KB )
  45. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/service.php ( 0.13 KB )
  46. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/AppService.php ( 0.26 KB )
  47. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Service.php ( 1.64 KB )
  48. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Lang.php ( 7.35 KB )
  49. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/lang/zh-cn.php ( 13.70 KB )
  50. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/Error.php ( 3.31 KB )
  51. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/RegisterService.php ( 1.33 KB )
  52. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/services.php ( 0.14 KB )
  53. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/PaginatorService.php ( 1.52 KB )
  54. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ValidateService.php ( 0.99 KB )
  55. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/service/ModelService.php ( 2.04 KB )
  56. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Service.php ( 0.77 KB )
  57. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Middleware.php ( 6.72 KB )
  58. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/initializer/BootService.php ( 0.77 KB )
  59. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Paginator.php ( 11.86 KB )
  60. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-validate/src/Validate.php ( 63.20 KB )
  61. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/Model.php ( 23.55 KB )
  62. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Attribute.php ( 21.05 KB )
  63. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/AutoWriteData.php ( 4.21 KB )
  64. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/Conversion.php ( 6.44 KB )
  65. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/DbConnect.php ( 5.16 KB )
  66. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/ModelEvent.php ( 2.33 KB )
  67. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/concern/RelationShip.php ( 28.29 KB )
  68. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Arrayable.php ( 0.09 KB )
  69. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/contract/Jsonable.php ( 0.13 KB )
  70. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/model/contract/Modelable.php ( 0.09 KB )
  71. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Db.php ( 2.88 KB )
  72. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/DbManager.php ( 8.52 KB )
  73. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Log.php ( 6.28 KB )
  74. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Manager.php ( 3.92 KB )
  75. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerTrait.php ( 2.69 KB )
  76. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/log/src/LoggerInterface.php ( 2.71 KB )
  77. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cache.php ( 4.92 KB )
  78. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/psr/simple-cache/src/CacheInterface.php ( 4.71 KB )
  79. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/helper/Arr.php ( 16.63 KB )
  80. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/driver/File.php ( 7.84 KB )
  81. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/cache/Driver.php ( 9.03 KB )
  82. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/CacheHandlerInterface.php ( 1.99 KB )
  83. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/Request.php ( 0.09 KB )
  84. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Request.php ( 55.78 KB )
  85. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/middleware.php ( 0.25 KB )
  86. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Pipeline.php ( 2.61 KB )
  87. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/TraceDebug.php ( 3.40 KB )
  88. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/middleware/SessionInit.php ( 1.94 KB )
  89. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Session.php ( 1.80 KB )
  90. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/driver/File.php ( 6.27 KB )
  91. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/SessionHandlerInterface.php ( 0.87 KB )
  92. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/session/Store.php ( 7.12 KB )
  93. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Route.php ( 23.73 KB )
  94. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleName.php ( 5.75 KB )
  95. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Domain.php ( 2.53 KB )
  96. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleGroup.php ( 22.43 KB )
  97. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Rule.php ( 26.95 KB )
  98. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/RuleItem.php ( 9.78 KB )
  99. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/route/app.php ( 1.72 KB )
  100. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/Route.php ( 4.70 KB )
  101. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/dispatch/Controller.php ( 4.74 KB )
  102. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/route/Dispatch.php ( 10.44 KB )
  103. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/controller/Index.php ( 4.81 KB )
  104. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/app/BaseController.php ( 2.05 KB )
  105. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/facade/Db.php ( 0.93 KB )
  106. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/connector/Mysql.php ( 5.44 KB )
  107. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/PDOConnection.php ( 52.47 KB )
  108. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Connection.php ( 8.39 KB )
  109. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/ConnectionInterface.php ( 4.57 KB )
  110. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/builder/Mysql.php ( 16.58 KB )
  111. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Builder.php ( 24.06 KB )
  112. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseBuilder.php ( 27.50 KB )
  113. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/Query.php ( 15.71 KB )
  114. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/BaseQuery.php ( 45.13 KB )
  115. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TimeFieldQuery.php ( 7.43 KB )
  116. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/AggregateQuery.php ( 3.26 KB )
  117. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ModelRelationQuery.php ( 20.07 KB )
  118. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ParamsBind.php ( 3.66 KB )
  119. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/ResultOperation.php ( 7.01 KB )
  120. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/WhereQuery.php ( 19.37 KB )
  121. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/JoinAndViewQuery.php ( 7.11 KB )
  122. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/TableFieldInfo.php ( 2.63 KB )
  123. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-orm/src/db/concern/Transaction.php ( 2.77 KB )
  124. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/driver/File.php ( 5.96 KB )
  125. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/LogHandlerInterface.php ( 0.86 KB )
  126. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/log/Channel.php ( 3.89 KB )
  127. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/event/LogRecord.php ( 1.02 KB )
  128. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-helper/src/Collection.php ( 16.47 KB )
  129. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/facade/View.php ( 1.70 KB )
  130. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/View.php ( 4.39 KB )
  131. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Response.php ( 8.81 KB )
  132. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/response/View.php ( 3.29 KB )
  133. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/Cookie.php ( 6.06 KB )
  134. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-view/src/Think.php ( 8.38 KB )
  135. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/framework/src/think/contract/TemplateHandlerInterface.php ( 1.60 KB )
  136. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/Template.php ( 46.61 KB )
  137. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/driver/File.php ( 2.41 KB )
  138. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-template/src/template/contract/DriverInterface.php ( 0.86 KB )
  139. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/runtime/temp/067d451b9a0c665040f3f1bdd3293d68.php ( 11.98 KB )
  140. /yingpanguazai/ssd/ssd1/www/f.mffb.com.cn/vendor/topthink/think-trace/src/Html.php ( 4.42 KB )
  1. CONNECT:[ UseTime:0.000492s ] mysql:host=127.0.0.1;port=3306;dbname=f_mffb;charset=utf8mb4
  2. SHOW FULL COLUMNS FROM `fenlei` [ RunTime:0.000830s ]
  3. SELECT * FROM `fenlei` WHERE `fid` = 0 [ RunTime:0.000500s ]
  4. SELECT * FROM `fenlei` WHERE `fid` = 63 [ RunTime:0.000360s ]
  5. SHOW FULL COLUMNS FROM `set` [ RunTime:0.000513s ]
  6. SELECT * FROM `set` [ RunTime:0.000263s ]
  7. SHOW FULL COLUMNS FROM `article` [ RunTime:0.000714s ]
  8. SELECT * FROM `article` WHERE `id` = 462299 LIMIT 1 [ RunTime:0.012319s ]
  9. UPDATE `article` SET `lasttime` = 1770589224 WHERE `id` = 462299 [ RunTime:0.032714s ]
  10. SELECT * FROM `fenlei` WHERE `id` = 66 LIMIT 1 [ RunTime:0.002850s ]
  11. SELECT * FROM `article` WHERE `id` < 462299 ORDER BY `id` DESC LIMIT 1 [ RunTime:0.012007s ]
  12. SELECT * FROM `article` WHERE `id` > 462299 ORDER BY `id` ASC LIMIT 1 [ RunTime:0.004329s ]
  13. SELECT * FROM `article` WHERE `id` < 462299 ORDER BY `id` DESC LIMIT 10 [ RunTime:0.006933s ]
  14. SELECT * FROM `article` WHERE `id` < 462299 ORDER BY `id` DESC LIMIT 10,10 [ RunTime:0.001631s ]
  15. SELECT * FROM `article` WHERE `id` < 462299 ORDER BY `id` DESC LIMIT 20,10 [ RunTime:0.013235s ]
0.159254s