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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.03 10:27:00