加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby – 构建有效的数组整数增量器,每个数字的上限不同

发布时间:2020-12-17 02:38:02 所属栏目:百科 来源:网络整理
导读:我想编制一个由数??字数组表示的计数器,从以下开始: [0,0] 这里的约束是,每个位置都有不同的上限,所以它不一定是9或其他东西,但它给出了.例如: [4,2,1] 这将导致以下增量序列: [0,0][0,1] [0,1,1][0,1][1,0]... 当然,我可以考虑使用模数的解决方案,并将每
我想编制一个由数??字数组表示的计数器,从以下开始:

[0,0]

这里的约束是,每个位置都有不同的上限,所以它不一定是9或其他东西,但它给出了.例如:

[4,2,1]

这将导致以下增量序列:

[0,0]
[0,1] 
[0,1,1]
[0,1]
[1,0]
.
.
.

当然,我可以考虑使用模数的解决方案,并将每个结转添加到下一个位置.但有人知道如何有效地实现这一点,分别使用漂亮的Ruby语法而不会过多地混淆它?

这是我天真的实施:

max = [10,10]
counter = [0,0]

i = counter.length-1
while counter != max do
   counter[i] = counter[i] + 1
   while counter[i] > max[i]
      counter[i] = 0
      i = i - 1
      counter[i] = counter[i] + 1
   end
   i = counter.length-1
 end

解决方法

为每个上限创建一个数组,其值从0到上限.获取第一个数组并使用其余数组计算笛卡尔积.

caps = [4,1]
arrs = caps.map{|cap| (0..cap).to_a} #=>[[0,3,4],[0,2],1]]
p arrs.shift.product(*arrs)
# =>[[0,0],1],...

如果您不想要一个包含结果的内存消耗数组,那么提供一个块.产品将逐一产生每个元素.

arrs = caps.map{|cap| (0..cap).to_a}
arrs.shift.product(*arrs){|el| puts el.join} #no resulting array
#000
#001
#010
#011
#...

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读