以下是五种经典算法的简明经验(伪原创版,保持原意与图片位置不变):
1、 汉诺塔谜题
2、 汉诺塔问题由法国数学家爱德华·卢卡斯于1883年首次提出,其灵感据说源自东南亚地区流传的一则古老寓言。尽管名称中带有“河内”,实则指代越南北部的历史名城——即今之河内市(注:非胡志明市,原文此处有误,已按史实校正)。传说在世界初开之时,印度圣城贝拿勒斯的神庙中竖立着三根金刚石柱,柱上套有64片黄金圆盘,按尺寸由小到大自上而下叠放于第一根柱上。神谕规定:僧侣须将全部金盘从起始柱移至目标柱,过程中必须严守规则——任一时刻,大盘不可压于小盘之上。每日仅允许移动一个圆盘。据传,当最后一片金盘落定于第三根柱时,天地将归于寂灭。该问题不仅承载着哲学意味,更因其天然契合递归逻辑,成为计算机科学中讲解分治策略与递归实现的经典范例。
3、 实现思路如下:
4、 设三根柱子分别命名为A(源柱)、B(辅助柱)、C(目标柱),任务是将n个盘子由A完整迁移至C。当n=1时,直接执行A→C;当n=2时,需借助B完成三步:A→B、A→C、B→C。对于n≥3的情形,可将顶部n−1个盘子整体视作子问题,先将其由A经C暂存至B,再将最大盘移至C,最后将B上的n−1个盘子经A移至C。整个过程通过递归不断拆解为更小规模的相同问题。移动n个盘所需的最少步数为2ⁿ−1。以64为例,总步数达2⁶⁴−1 ≈ 1.84×10¹⁹次。若每秒完成一次无间断操作,所需时间约为5845亿年,远超当前宇宙年龄。
立即学习“Java免费学习笔记(深入)”;
5、 下方为Java语言实现汉诺塔求解的典型代码结构。
6、 }
7、 将编号为1的圆盘从起始柱移至目标柱,并打印该操作步骤。
8、 输出格式提示:“将第 topN 号盘子从 [from] 移动到 [to]”,并实时显示每一步路径。
9、 }
10、 }
11、 }
12、 运行效果所示

13、 斐波那契数列
14、 斐波那契数列是一组以0和1为初始项、后续每一项均为前两项之和所构成的整数序列。其展开形式为:0、1、1、2、3、5、8、13、21、34、55、89、144、233、377、610、987、1597、2584、4181、6765、10946、17711、28657、46368……该数列频繁出现在植物叶序、蜂巢结构、螺旋星系等自然现象中,亦广泛应用于金融建模、图像压缩及算法分析等领域,展现出惊人的普适性与数学美感。
15、 注意:标准定义中,第0项为0,第1项为1。
16、 自第2项起(即索引为2的位置),每一项均等于其前两项数值之和。
17、 下方示例展示了使用Java语言生成指定项斐波那契数的常见编程方式。
18、 }
19、 控制台输出:“第 counter 项斐波那契数为:fibonacci(counter)”。
20、 }
21、 }
22、 }
23、 运行效果所示

24、 帕斯卡三角形
25、 帕斯卡三角形中的每个元素对应组合数C(n, r),其中n表示行号(从0开始计),r表示列号(同样从0起算)。因此,该三角形本质上是对二项式系数分布的可视化呈现,深刻反映了排列组合的基本规律与对称特性。
26、 下方为Java语言构建帕斯卡三角形的标准实现方式。
27、 请用户输入希望生成的三角形行数:
28、 }
29、 }
30、 }
31、 }
32、 }
33、 }
34、 }
35、 }
36、 }
37、 运行效果所示

38、 三色旗问题
39、 问题背景:
40、 此问题最早由荷兰著名计算机科学家艾兹赫尔·戴克斯特拉(Edsger W. Dijkstra)提出,原称“荷兰国旗问题”(Dutch National Flag Problem),因他本人国籍而得名;后因颜色组合直观易记,中文语境中多称“三色旗问题”。设想一根绳子上随机悬挂红(R)、白(W)、蓝(B)三种颜色的小旗,要求仅通过有限次两两交换操作,将其重排为“蓝—白—红”的严格顺序。整个过程不允许引入额外存储空间(如新数组),所有调整必须在原序列上就地完成。该问题不仅是排序思想的精炼体现,更是理解分区(partitioning)技术与双指针技巧的重要入口。
41、 解决策略
42、 类比于物理绳子上的移动,程序中即表现为单数组内的原地重排。核心在于设立三个指针:low(指向蓝色区域右边界)、mid(当前扫描位置)、high(红色区域左边界)。遍历过程中依据当前元素颜色决定不同动作:遇蓝色则与low处交换并推进low与mid;遇白色则仅推进mid;遇红色则与high交换并收缩high。此方法确保仅需一次遍历、最多n次交换即可完成整理,时间复杂度O(n),空间复杂度O(1),极具教学与工程价值。
43、 下方为Java语言实现三色旗重排的经典编码示例。
44、 }
45、 }
46、 }
47、 }
48、 请输入初始旗帜排列字符串(例如:RWBBWRWR):
49、 输出重排后的最终序列:flags。
50、 }
51、 }
52、 运行效果所示

53、 埃拉托斯特尼筛法(质数筛选算法)
54、 算法说明:
55、 质数是指大于1且除了1和自身外不能被其他正整数整除的自然数。尽管判断单个数字是否为质数较为简单,但在大规模范围内高效识别全部质数却极具挑战。埃拉托斯特尼筛法作为一种历史悠久、原理清晰且效率优异的经典算法,通过“标记合数、保留质数”的机制,在O(N log log N)时间内快速筛出1至N区间内所有质数,至今仍被广泛应用于密码学、数论研究及各类编程实践之中。
56、 核心思想:
57、 直接试除法虽可行,但效率低下;优化方向之一是减少冗余检测。埃拉托斯特尼筛法摒弃逐个验证,转而采用“批量剔除”策略:先假定2~N全为质数,然后从最小质数2开始,将其所有倍数(4, 6, 8…)标记为合数;接着取下一个未被标记的数(即3),再筛去其倍数(9, 15, 21…);依此类推,直到处理完所有不超过√N的数为止。剩余未被标记者即为所求质数集合。
58、 关键优化点在于:验证某数N是否为质数时,只需测试2至⌊√N⌋之间的整数能否整除它。这是因为若N存在大于√N的因子p,则必存在对应因子q=N/p
59、 假设我们有一个包含1到N所有整数的列表,初始状态如下:
60、 首轮以2为基底,从4起每隔2个位置标记一次,清除所有偶数(除2本身);
61、 第二轮以3为基底,从9起每隔3个位置标记,剔除剩余的3的倍数(如9、15、21…);
62、 接着用5、7、11等依次进行类似操作,直至基底超过√N为止。最终未被标记的数字即为质数。这一系统化筛选流程,正是埃拉托斯特尼筛法的精髓所在。
63、 对应Java代码实现如下:
64、 初始化布尔数组,标识各数是否为质数(默认true)
65、 }
66、 外层循环上限设为√N,即 i * i
67、 }
68、 内层循环从i²开始,以i为步长,将所有i的倍数设为false
69、 }
70、 }
71、 统计并输出实际执行的筛选次数(含count变量累计值)
72、 }
73、 }
74、 }
75、 }
76、 }











