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

Ruby生成6个数字可重复4位排列嵌套数组及代码bug求解

Bug产生原因
  • 核心问题是Ruby的数组赋值属于引用传递,执行all_possible_combinations[i+1] = all_possible_combinations[i]时,并没有复制出一份新的独立数组,只是让索引i+1位置的变量指向了和索引i位置完全相同的数组对象——相当于给同一个文件建了两个快捷方式,不管通过哪个入口修改,改的都是同一个源文件。后续修改all_possible_combinations[i+1][x]本质是修改这个被共享的数组本身,自然会出现两个索引位置的值同步变化的现象。
  • 除了引用问题,你原本的索引递增逻辑本身也存在错误:按你写的x从3递减到0就重置为3的规则,会按固定顺序轮流修改四个位置的数值,完全不符合可重复排列生成需要的「从最右位开始累加、满6就往左位进1」的规则,哪怕解决了引用问题,生成的结果也完全不符合排列顺序要求。
正确实现方式

方案1:使用Ruby内置方法(最简洁,推荐)

Ruby标准库已经提供了生成可重复排列的现成方法,不需要自己手写循环逻辑,一行代码即可实现需求:

# 生成1-6范围内所有长度为4的可重复排列,结果共6^4=1296组
all_possible_combinations = [1,2,3,4,5,6].repeated_permutation(4).to_a

方案2:手写进位逻辑实现

如果需要手动实现累加进位的逻辑,可以参考如下代码,注意每次赋值数组时使用dup创建独立副本,避免引用共享问题:

all_possible_combinations = []
current = [1, 1, 1, 1]
all_possible_combinations << current.dup

1295.times do
  # 从最右侧位(索引3)开始处理进位
  carry = 1
  3.downto(0) do |idx|
    current[idx] += carry
    if current[idx] > 6
      current[idx] = 1
      carry = 1 # 满6,向左进1
    else
      carry = 0
      break # 无进位,停止往左遍历
    end
  end
  all_possible_combinations << current.dup
end

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 03:24:29