You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实时绘制3x+1问题运算序列的动态折线图

3x+1运算过程实时折线图实现方法

你原来的代码有两个明显问题:一是没有终止条件,数值降到1之后会反复在1→4→2→1里死循环,永远跑不完;二是只用print打印结果,没有存储每一步的运算序列,没法给折线图提供数据源。

用matplotlib的交互模式就能实现边运算边绘图的效果,不需要等所有计算跑完再出图,第一次运行前先执行pip install matplotlib安装依赖,完整可运行代码如下:

import matplotlib.pyplot as plt
from random import randint

# 生成1-100之间的随机起始值
current_num = randint(1, 100)
step = 0
# 存储运算步数、对应数值的列表,作为折线图数据源
x_steps = []
y_values = []

# 开启matplotlib交互模式
plt.ion()
# 创建画布和坐标轴
fig, ax = plt.subplots(figsize=(10, 6))
# 初始化折线对象
line, = ax.plot(x_steps, y_values, marker='o', markersize=3, color='#1f77b4')

# 设置图表基础属性
ax.set_title('3x+1问题运算过程实时变化', fontsize=14)
ax.set_xlabel('运算步数', fontsize=12)
ax.set_ylabel('当前数值', fontsize=12)
ax.grid(alpha=0.3)

while True:
    # 将当前步结果存入数据源
    x_steps.append(step)
    y_values.append(current_num)
    
    # 更新折线数据
    line.set_xdata(x_steps)
    line.set_ydata(y_values)
    # 自动调整坐标轴范围适配新数据
    ax.relim()
    ax.autoscale_view()
    
    # 刷新画布渲染新内容
    fig.canvas.draw()
    fig.canvas.flush_events()
    # 控制刷新速度,数值越小刷新越快
    plt.pause(0.3)
    
    # 运算到1即终止,避免死循环
    if current_num == 1:
        break
    
    # 按照3x+1规则计算下一个值
    if current_num % 2 == 0:
        current_num = int(current_num / 2)
    else:
        current_num = current_num * 3 + 1
    step += 1

# 关闭交互模式,保留图像窗口
plt.ioff()
plt.show()

关键逻辑说明

  • 核心是调用plt.ion()开启matplotlib的交互渲染模式,默认模式下程序会阻塞在绘图逻辑,必须等所有代码执行完才会显示图像,做不到实时刷新
  • 每算完一个值就更新折线数据源,之后必须调用relim()和autoscale_view()自动调整坐标轴范围,不然数值变大后折线会跑出画布可视区域
  • 偶数运算时把结果转成整数,避免出现2.0、1.0这类浮点数,数值展示更整洁
  • 你可以根据需要调整plt.pause()里的参数,数值越小折线刷新速度越快,设成0.1就能看到比较流畅的跳变效果

内容的提问来源于stack exchange,提问作者Reuban Ramsden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 09:57:27