我在浏览,我发现了这个:
var i, len;
for(i = 0, len = array.length; i < len; i++) {
//...
}
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是:
是否正常循环(不缓存长度的循环)array.length每次检查?
我希望采用任意数量的列表(例如[2,1,4 ...],[8,3,...],...)并从每个列表中选择数字以生成所有排列.例如:
[2,8,...],[2,3,...],[1,8,...],[1,3,...],[4,8,...], [4,3,...],......
这可以使用嵌套的for循环轻松完成,但由于我希望它接受任意数量的列表,似乎for循环必须是硬编码的.每个列表一个.此外,由于我的程序可能会产生数万个排列,我想一次生成一个单独的排列(而不是一次性计算它们并将结果存储到向量中).有没有办法以编程方式完成此操作?
由于在编译时知道列表的数量,我想也许我可以使用基于模板的元编程.然而,这看起来很笨拙,也不符合"一次一个"的要求.有什么建议?
我实现了一个简单的方法来生成笛卡尔积,Seq如下所示:
object RichSeq {
implicit def toRichSeq[T](s: Seq[T]) = new RichSeq[T](s)
}
class RichSeq[T](s: Seq[T]) {
import RichSeq._
def cartesian(ss: Seq[Seq[T]]): Seq[Seq[T]] = {
ss.toList match {
case Nil => Seq(s)
case s2 :: Nil => {
for (e <- s) yield s2.map(e2 => Seq(e, e2))
}.flatten
case s2 :: tail => {
for (e <- s) yield s2.cartesian(tail).map(seq => e +: seq)
}.flatten
}
}
}
Run Code Online (Sandbox Code Playgroud)
显然,这个很慢,因为它一次计算整个产品.有人在Scala中为这个问题实现了一个懒惰的解决方案吗?
UPD
好的,所以我在笛卡尔积上实现了一个非常愚蠢但是工作的迭代器版本.在这里发布给未来的爱好者:
object RichSeq {
implicit def toRichSeq[T](s: Seq[T]) = …Run Code Online (Sandbox Code Playgroud) 我正在寻找循环通过一系列选项的最佳方法,以确保我点击所有可用选项.
我创建了一个功能,允许客户端构建基本上是彼此叠加的其他图像的图像.这些其他图像被分成不同的组.它们在图像一侧有链接,可以单击它们滚动浏览所有不同的图像以查看它们.
现在,我正在制作一个自动化流程,该流程将运行在用户单击其中一个链接时更改图像的功能.我需要确保在此过程中击中不同图像的每个可能组合.
假设有3种不同的帽子,4种不同的衬衫,5种不同的裤子和6种不同的鞋子.我可以将其表示为一个数组,其中包含每个组的选项数.目前的数组是[3, 4, 5, 6].
循环遍历此数组以确保显示所有可能选项的最佳方法是什么?
你能建议更简单,更清晰的方式来编写这个函数吗?
let cartesian_product sequences =
let step acc sequence = seq {
for x in acc do
for y in sequence do
yield Seq.append x [y] }
Seq.fold step (Seq.singleton Seq.empty) sequences
Run Code Online (Sandbox Code Playgroud) 我一直试图找到解决方案,但无济于事.我想要实现的目标是能够找到多个列表的所有独特组合.所以,假设我有3个复选框列表(但这是现实应用程序中的未知数字),颜色,大小,包大小.列表中的项目将是unqiue.
[0] => ['blue', 'green']
[1] => ['small', 'medium', 'large']
[2] => ['Pack Of 6', 'Pack Of 8']
Run Code Online (Sandbox Code Playgroud)
我想要" 蓝色,小号,6件装 "," 蓝色,中号,6件装 "," 蓝色,大号,6件装 "," 蓝色,小号,8件装 "," 蓝色,中号,包装8 "等.订购并不重要,但将其逻辑分组会很好.
我已经使用jQuery将列表拉入数组:
options = [];
jQuery('.option-types').each(function(){
opts = [];
jQuery('input:checked', this).each(function(){
opts.push(jQuery(this).next().text());
});
options.push(opts)
});
Run Code Online (Sandbox Code Playgroud)
如果有一个递归的功能路径来回答这个是理想的,就像我说的那样,列表的数量可以是任何东西,以及列表的内容.
希望你们和女孩们可以提供帮助,这是我的头脑.
干杯 - 丹
JavaScript的数学集合实现在哪里?它应该包括交叉,联合,补充和(对于奖励积分)笛卡尔积的有效实现.
不,这不是功课.我有一个yubikey,它是一个USB键盘,键入从16个密钥代码中选择的序列,键入一个128位的一次性密码(otp).为了使其更有用,软件应根据生成的字符检测键盘布局,并将这些字符映射回"us"布局中的内容,以便与现有后端兼容.
所以我有93个不同的16个字符序列,代表yubikey可以在430个键盘布局中输入的所有内容.(为此目的,许多布局都是相同的.)特定otp的可能映射是每个16个字符的序列,其中包含otp中的每个字符.
为了有效地找到它,我使用反向索引将每个可能的字符映射到使用该字符的键盘布局列表.答案是otp中每个唯一字符的反向索引的每个条目的交集.这几乎总是与1个元素结合在一起.
用一个很好的实现来编写这个跨浏览器会更容易Set().
javascript ×4
arrays ×2
c++ ×1
f# ×1
intersection ×1
jquery ×1
loops ×1
math ×1
nested ×1
permutation ×1
scala ×1
sequences ×1
set ×1