我做了个约瑟夫问题可视化工具:用 debug 式动画让抽象算法变直观,GitHub Pages 可直接玩

0 阅读2分钟

不知道你们学约瑟夫环的时候有没有过这种 “懂了但没完全懂” 的崩溃?照着教程敲代码能跑通,输入 n=5、k=3 能精准输出最后剩下的节点,但脑子里始终脑补不出 “哪个节点先被踢走、下一轮计数从哪开始、剩下的节点怎么重新组成环” 的过程;找过几个现成的动画工具吧,要么是直接播完最终结果,要么是快进得飞起,想暂停看某一步的逻辑都不行,debug 算法的时候简直抓瞎!

作为一个 “代码能写但得看见过程才安心” 的开发者,干脆自己撸了个可视化工具 —— 核心思路特别简单:左侧放可交互的代码区,右侧是环的动画区,两者实时同步,就像用 IDE debug 一样一步一步看算法执行

举个具体的小例子:当你设置 n=5(5 个节点)、k=3(数到 3 删节点),点击 “步进执行” 后,左侧代码会一行一行高亮,当执行到 “找到第 3 个节点” 这行时,右侧动画里的第 3 个节点会立刻变红高亮,还会用箭头标出当前计数位置;接着执行 “删除该节点” 的代码时,右侧的高亮节点会慢慢消失,剩下的 4 个节点自动调整位置重新组成环,同时用绿色标出下一轮计数的起始点。整个过程不用猜,代码执行到哪,动画就展示哪一步的结果,抽象的 “删节点、重组成环” 一下子就直观了。而且还支持暂停、回退、一键重置,想在哪一步停下来琢磨都可以。

当然做的时候也踩了两个小坑:一是怎么让代码行数和动画步骤精准对齐 —— 最后是在计数、判断、删除这些关键逻辑处埋了 “事件触发点”,代码执行到这些点就给动画区发信号,确保不脱节;二是环的动态渲染,删除节点后要让剩下的节点平滑调整位置,还得保证下一轮计数起点不跑偏,这里调了好几个布局算法才搞定。

最后放个传送门:

欢迎大家上手玩一玩,要是遇到 bug 或者有优化建议,随时提 Issue;也希望这个小工具能帮到更多刚学约瑟夫环、被抽象算法绕晕的新手,让算法学习少点困惑,多点直观!