如何在控制台中绘制3n+1问题的折线图?
3n+1问题折线图实现方案
前置逻辑调整
现有代码仅输出迭代数值,需要先将完整迭代序列存储下来,作为折线图的数据源:
using System; using System.Collections.Generic; public class Program { public static void Main() { Console.Write("Enter a number: "); int n = Convert.ToInt32(Console.ReadLine()); // 存储完整迭代序列,包含初始输入值 List<int> collatzSequence = new List<int> { n }; while (n != 1) { if (n % 2 == 0) { n /= 2; } else { n = 3 * n + 1; } collatzSequence.Add(n); Console.WriteLine(n); } Console.WriteLine("序列生成完成,总迭代步数:" + (collatzSequence.Count - 1)); // 绘制逻辑可插入在此处 } }
方案1:控制台字符折线图(无额外依赖)
不需要引入任何UI库,直接在控制台输出简易折线,适合快速验证效果:
// 插入到上述代码的绘制逻辑位置 int maxVal = collatzSequence.Max(); int stepCount = collatzSequence.Count; // 从最大值到1逐行打印Y轴和数据点 for (int y = maxVal; y >= 1; y--) { Console.Write($"{y,4} | "); for (int x = 0; x < stepCount; x++) { Console.Write(collatzSequence[x] == y ? "* " : " "); } Console.WriteLine(); } // 打印X轴和刻度 Console.WriteLine(" " + new string('-', stepCount * 2)); Console.Write("Step: "); for (int x = 0; x < stepCount; x++) { Console.Write($"{x,2}"); }
方案2:WinForm Chart控件实现(交互式桌面可视化)
如果使用.NET Core 3.0以上版本,需要先安装NuGet包System.Windows.Forms.DataVisualization
- 新建WinForm项目,从工具箱拖拽
Chart控件到窗体 - 在按钮点击/窗体加载事件中加入以下逻辑:
// 先调用逻辑生成collatzSequence序列 chart1.Series.Clear(); var series = chart1.Series.Add("Collatz序列"); series.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line; series.MarkerStyle = System.Windows.Forms.DataVisualization.Charting.MarkerStyle.Circle; // 绑定序列数据 for (int i = 0; i < collatzSequence.Count; i++) { series.Points.AddXY(i, collatzSequence[i]); } // 配置坐标轴样式 chart1.ChartAreas[0].AxisX.Title = "迭代步骤"; chart1.ChartAreas[0].AxisY.Title = "数值"; chart1.ChartAreas[0].AxisY.Minimum = 1;
方案3:导出CSV生成图表(无需写UI代码)
直接把序列导出为CSV文件,用Excel/WPS打开后插入折线图即可,适合需要专业图表输出的场景:
using System.IO; // 导出逻辑,插入到绘制逻辑位置 string savePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "collatz_sequence.csv"); using (StreamWriter sw = new StreamWriter(savePath)) { sw.WriteLine("迭代步骤,数值"); for (int i = 0; i < collatzSequence.Count; i++) { sw.WriteLine($"{i},{collatzSequence[i]}"); } } Console.WriteLine($"序列已导出到桌面的collatz_sequence.csv,打开后直接插入折线图即可");
内容的提问来源于stack exchange,提问作者Lê Trần Nam Khánh
相关产品推荐
相关产品推荐

