将matplotlib.pyplot导入为plt 将numpy导入为np def collatz(种子): “”“应用Collatz猜想算法,并在每次迭代后存储种子的所有值,以便稍后显示”“” y=[种子] 当播种时!= 1: 如果种子%2==0: 种子=种子/2 其他: 种子=(3*种子)+1 y.append(种子) 返回y 颜色=plt.cm.bwr(np.linspace(0,11500)) 对于范围(11500)中的i:#通过将算法应用于特定的种子集来收集数据 Y=collatz(i) plt.plot(Y,颜色=颜色[i]) plt.title(“科拉茨猜想”) plt.xlabel(“卡住之前的迭代次数”) plt.ylabel(“达到值”) 展示()
-
\$\开始组\$ 你能展示出结果图吗? \$\端组\$ – 无可奉告 5月1日20:42 -
2 \$\开始组\$ 我已回滚Rev 4 → 3.请参阅 当有人回答我的问题时,我该怎么办? . \$\端组\$ – S公司 ᴀᴍ 打开 ᴇᴌᴀ ♦ 5月2日22:08
3个答案
颜色=plt.cm.bwr(np.linspace(0,11500)) 对于范围(11500)内的i: ...
定义plot_collatz(n_seeds=1500): # ------------ “”“为给定数量的种子绘制Collatz序列”“” 颜色=plt.cm.bwr(np.linspace(0,1,n种子+1)) # --------- 对于范围(1,n种子+1)内的种子: # --------- plt.plot(collatz(种子),颜色=颜色[种子]) plt.title(“科拉茨猜想”) plt.xlabel(“卡住之前的迭代次数”) plt.ylabel(“达到的值”) 展示() plot_collatz(10)
-
-
-
\$\开始组\$ @nocomment此图是 plot_collatz(10) (前面的代码块),因此它不包含种子1161。 如果你对更高的种子感兴趣,这个数字会变得很忙,但以下是 1500个序列的版本 . \$\端组\$ – tdy(时间) 5月2日1:52 -
\$\开始组\$ @正如上面的答案所说,这个图背后的主要思想是显示如果应用算法,某些种子的行为。 是的,看到哪个种子产生了特定的情节并不是很好,但我认为它很好地显示了序列的混乱程度。也许与散点图搭配会更有意义 \$\端组\$ – 洛伦佐 5月2日4:54 -
整数算术
>>> 10 / 2 5
>>>2**53+1.0#你会觉得这很奇怪,但事实并非如此! 9007199254740992
-
-
-
-
\$\开始组\$ @洛伦佐实际上 // 而不是 / 可能会成功 更慢的 。因为整型数往往比浮点数慢,因为需要处理它们的任意大小。 你可以测量一下。 但是。。。 你真的应该使用int。 否则你可能会得到错误的结果! \$\端组\$ – 无可奉告 5月1日20:14 -
1
标识符
注释
单一责任
def collatz(种子): “”“应用Collatz猜想算法,并在每次迭代后存储种子的所有值,以便稍后显示”“”
计算 和 商店
通过键入import Generator def collatz(seed:int)->生成器[int,None,None]: “”“生成冰雹值。”“” n=种子 当n>1时: 如果n%2: n=3*n+1 其他: n//=2 产量n def main(num_seeds:int=1500)->无: ... 对于范围(1,num_seeds+1)中的种子: y=列表(collatz(种子)) ...
彩色地图
缓存
-
\$\开始组\$ 谢谢你详尽的回答。 循环颜色图不会“隐藏”算法的混乱吗? 我认为非循环颜色图更容易估计种子:小种子=蓝色,大种子=红色(显然与所选间隔有关)。 顺便说一下,这是我的第一个matplotlib程序,>我还在学习python的基础知识,所以我真的不知道如何检查缓存。 \$\端组\$ – 洛伦佐 5月1日20:16 -
-
\$\开始组\$ 关于缓存:在dict中查找int也很快,特别是当它们像这里一样密集时。 顺便说一句,如果缓存实际上没有帮助,那么另一个想法是:他们已经在使用NumPy。 我们可以并行运行所有种子。 将它们放在一个数组中,然后对所有它们执行一个步骤,然后过滤出1。 直到没有留下。 这可能会很有竞争力/很有趣。 \$\端组\$ – 无可奉告 5月1日20:40 -
\$\开始组\$ cPython 字典 实现令人印象深刻,但对于当前的“密集”情况,它不可能与阵列访问竞争,因为它必须做更多的工作。// 并行运行所有种子当然有一些魅力。 加油! 创建实施,发布答案; 我会投赞成票。 \$\端组\$ – J_小时 5月1日21:34 -
\$\开始组\$ 哦,我没有将它与数组(或列表?)访问进行比较。 我说的是你的最后一段,听起来用dict缓存可能会让他们的代码变慢。 虽然使用数组/列表缓存,但您可能需要提前知道峰值,或者始终检查是否要扩展它,这可能比dict访问成本更高。 我已经完成了NumPy版本,它确实更快了,但我认为它不适合在这里作为答案。 我会在下一条评论中添加链接。 \$\端组\$ – 无可奉告 5月1日21:47