VBA实现Collatz树代码子节点值缺失问题修复技术问询
VBA实现Collatz树的修复代码
原代码核心问题为单元格写入逻辑采用对角线偏移,多个子节点写入同一列时会出现值覆盖,同时未按层级统一生成节点、缺少节点去重校验,导致子节点缺失。
修复后完整代码如下:
Public Sub CollatzTree() ' 配置参数:生成的树层数,可按需调整 Const MAX_LEVEL As Long = 12 Dim ws As Worksheet Dim exists As Collection Dim currentLevel As Collection, nextLevel As Collection Dim i As Long, n As Long, child1 As Long, child2 As Long, j As Long ' 初始化工作表,清空旧数据 Set ws = ThisWorkbook.Sheets("OUTPUT") ws.Cells.Clear ' 初始化已存在节点集合、首层节点 Set exists = New Collection Set currentLevel = New Collection currentLevel.Add 1 exists.Add 1, CStr(1) ws.Cells(1, 1) = 1 ' 按层迭代生成节点 For i = 2 To MAX_LEVEL Set nextLevel = New Collection ' 遍历当前层所有节点生成子节点 For Each n In currentLevel ' 所有节点的公共子节点:2*n child1 = 2 * n nextLevel.Add child1 On Error Resume Next exists.Add child1, CStr(child1) On Error GoTo 0 ' 偶数节点判断是否满足右子节点条件 If n Mod 2 = 0 Then child2 = (n - 1) / 3 ' 校验条件:整数、大于0、未在树中 If (n - 1) Mod 3 = 0 And child2 > 0 Then On Error Resume Next exists.Add child2, CStr(child2) If Err.Number = 0 Then ' 不存在则添加到下一层 nextLevel.Add child2 End If On Error GoTo 0 End If End If Next n ' 将当前生成的下一层节点写入Excel对应行 For j = 1 To nextLevel.Count ws.Cells(i, j) = nextLevel(j) Next j ' 替换当前层为下一层,继续迭代 Set currentLevel = nextLevel Next i ' 输出所有节点到立即窗口 Dim v For Each v In exists Debug.Print v; Next End Sub
关键修改说明
- 新增节点去重校验:用
Collection的key唯一特性判断节点是否已存在,严格符合规则中“(n-1)/3不在树中才添加为右子节点”的要求 - 按层生成节点:先完整计算出下一层所有节点,再统一写入Excel对应行,彻底避免单元格写入位置冲突导致的覆盖问题
- 移除了冗余的GoTo跳转和硬编码的单元格偏移逻辑,层级生成逻辑和A088976的序列规则完全对齐
- 增加了工作表旧数据清理步骤,避免历史数据干扰运行结果
运行后OUTPUT工作表的每一行对应A088976序列的每一组值,不会再出现子节点缺失、值覆盖的问题。
内容的提问来源于stack exchange,提问作者Juggler_IN
相关产品推荐
相关产品推荐

