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
相关产品推荐
相关产品推荐

