TLDR:我正在寻找一种算法,它在知道:
- 其中一个数字
- 我的数组的大小
- 数字可能的最小值和最大值
我正在使用一个音乐应用程序并且有一个算法问题:当混合不同的节奏(每个节奏都有不同的步数)时,我需要计算结果循环的步数。这可以通过最小公倍数计算轻松完成。假设我有一个包含所有不同长度的长度数组
var lengths = [4,5,6,8]
//greatest common denominator
function gcd(a,b){
var t,b,a
while(b != 0){
t = b;
b = a%b
a=t
}
return a;
}
//least common multiplier
function lcm(a,b){
return a*b/gcd(a,b)
}
function getLoopLength(arr{
var result = 1;
for(var i = 0;i<arr.length;i++)
result = lcm(result,arr[i])
return m
}
getLoopLength(lengths)
==> 120
// superimposing 4 rhythm with length 4,5,6 and 8 will result in a a rhythms that loops in 120 steps
现在我需要一个函数来计算以下假设的最小步数:
- 可能的步长是有界的(在我的情况下在 2 到 11 之间 - 可能会改变)
- 所有步长值必须不同
- 1 个长度值是已知的(将是一个变量)
- 我的长度数组的大小可以变化(在我的情况下在 1 到 4 之间 - 不会改变)
所以我追求的是一个看起来像这样的函数:
var minPossibleLength(knownLength, lengthsSize){
...
return min
}
例如 minPossibleLength(4,4) 应该返回 24(当我的长度是 [2, 4 ,8,3] 或 [2, 4 ,8,6] 时)
现在我尝试强制它,遍历所有可能的长度组合并找到最小 lcm,它确实适用于我的条件,但我很想知道我是否能找到更优雅和有效的解决方案。
谢谢