Python for循环计算仅返回单值问题排查与Matplotlib绘图实现
现有代码的核心问题
- 函数名不匹配:定义的函数名是
Dialer_Problems,循环内调用时漏写了末尾的s,会直接触发NameError运行报错 - 函数逻辑冗余失效:函数内部写了无关的
for S in range(0,9)循环,没有使用传入的参数S,无论输入什么N值,返回结果完全固定,是最终只输出单个结果的核心原因 - 邻接矩阵运算错误:计算图上N步可达路径数需要用矩阵幂运算,原代码用numpy逐元素幂的写法,得到的结果完全不符合图论路径计数规则
- 语法拼接错误:
Dialer_Problems(5,10)t1=time.time()两行代码粘连,且t1=time.time漏写括号,无法正确获取时间戳 - 结果无持久存储:循环内每次计算的结果直接被下一轮覆盖,没有写入独立容器,自然无法累计得到200组连续序列
批量收集200组计算结果的修正实现
import numpy as np import time import matplotlib.pyplot as plt # 初始化图邻接矩阵 A = np.array([[0,0,0,0,0,0,0,0,1,0], [0,0,1,0,1,0,0,0,0,0], [0,1,0,1,0,1,0,0,0,0], [0,0,1,0,0,0,1,0,0,0], [0,1,0,0,0,1,0,1,0,0], [0,0,1,0,1,0,1,0,1,0], [0,0,0,1,0,1,0,0,0,1], [0,0,0,0,1,0,0,0,1,0], [1,0,0,0,0,1,0,1,0,1], [0,0,0,0,0,0,1,0,1,0]]) omega_1 = np.array([1,1,1,1,1,1,1,1,1,1]) def Dialer_Problems(start_node, step_n): # 修正:去掉冗余循环,用正确的矩阵幂计算N步路径矩阵 path_matrix = np.linalg.matrix_power(A, step_n - 1) omega = omega_1 @ path_matrix return omega # 初始化空列表存储每一轮的计算结果 result_list = [] # 生成N取值序列,范围1到200 n_values = list(range(1, 201)) t1 = time.time() for n in n_values: current_res = Dialer_Problems(start_node=5, step_n=n) # 这里可根据分析需求选择存储值:可存全量10维节点结果,也可提取单值(比如总路径数、特定节点的路径计数) # 示例:提取全节点总路径数作为绘图用标量 total_path = current_res.sum() result_list.append(total_path) t2 = time.time() print(f"200组计算总耗时:{t2 - t1:.4f} 秒") print(f"累计收集结果数量:{len(result_list)} 组")
适配场景的Matplotlib绘图实现
配合存储的连续结果序列,直接配对x轴(N值)和y轴(对应计算值)即可生成趋势图,完整绘图代码如下:
# 解决Matplotlib中文显示、负号显示问题 plt.rcParams['font.sans-serif'] = ['SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(10, 6)) plt.plot(n_values, result_list, linewidth=1.5, marker='o', markersize=2, label='不同步长N对应的总路径数') plt.xlabel('步长N') plt.ylabel('计算结果(合法路径总数)') plt.title('拨号问题计算结果随N的变化趋势') plt.grid(alpha=0.3, linestyle='--') plt.legend() plt.show()
内容的提问来源于stack exchange,提问作者Mary
相关产品推荐
相关产品推荐

