我必须减少我的文字墙,这意味着我无法解释代码的内容。但问题是: 此代码生成满足某些要求和规范的分数。 此要求导致函数 CommonFactor 的大量调用,例如 3000000 或更多。我在最大 msp 中使用此 javascript 代码,我可以生成分数,但我无法避免关于许多递归调用的错误消息。 那我该怎么办呢?!
var unit = 0;
var maxSubdivision = 0;
var minSubdivision = 0;
var fractionN = 0;
var fractionD = 0;
function CommonFactor(numerator, denominator) {
return denominator == 0 ? numerator: CommonFactor(denominator, numerator % denominator);
}
function length( minutes, bpm) {
unit = 60*minutes*Math.round(bpm/60);
minSubdivision = 2
maxSubdivision = unit*10;
}
function genrandSub(){
var random = Math.floor(Math.random() *(maxSubdivision-(minSubdivision-1))+(minSubdivision));
var unitD = unit;
var factor = CommonFactor(random, unitD);
if(factor != 1 && random != unit) {
random = random/factor;
unitD = unitD/factor;
if(random <= 16 && unitD <= 32) {
fractionN = random;
fractionD = unitD;
}
else{
genrandSub();
}
}
else{
genrandSub();
}
}
function findConvergence(nA,dA, nB, dB){
var whenB = nB * dA;
var whenA = dB * nA;
var length = dA * whenA;
factor = CommonFactor(nA, length);
nA = nA/factor;
length = length/factor;
if(nA == 1 && length == unit){
return true;
}
else{
return false;
}
}
function genPattern (hwMany) {
var subdivisionN = new Array();
var lengthD = new Array();
for(var i = 0; i < hwMany; i ++){
if(i == 0) {
genrandSub();
subdivisionN[i] = fractionN;
lengthD[i] = fractionD;
}
else {
var index = 0;
rand = genrandSub();
if(findConvergence (fractionN, fractionD,subdivisionN[i-1], lengthD[i-1]) != true){
var state = false;
while(state == false){
rand = genrandSub();
state = findConvergence (fractionN, fractionD,subdivisionN[i-1], lengthD[i-1]);
index += 1;
if(index == 6){
state = true;
}
}
if(index == 6){
genPattern(hwMany);
}
else{
subdivisionN[i] = fractionN;
lengthD[i] = fractionD;
}
}
else{
subdivisionN[i] = fractionN;
lengthD[i] = fractionD;
}
}
}
for( var k = 0 k < subdivisionN.length; k++){
console.log(subdivisionN[k]);
console.log(lengthD[k]);
}
}
length(60,60);
genPattern(4);
大家好,我解决了问题,但我无法解释原因。在我看来,我解决问题的方式似乎是合乎逻辑的,但我希望有人评论并更好地解释我。我想了解更多。 所以我以前的代码我有:
function genPattern (hwMany) {
var subdivisionN = new Array();
var lengthD = new Array();
for(var i = 0; i < hwMany; i ++){
if(i == 0) {
genrandSub();
subdivisionN[i] = fractionN;
lengthD[i] = fractionD;
}
else {
var index = 0;
rand = genrandSub();
if(findConvergence (fractionN, fractionD,subdivisionN[i-1], lengthD[i-1]) != true){
var state = false;
while(state == false){
rand = genrandSub();
state = findConvergence (fractionN, fractionD,subdivisionN[i-1], lengthD[i-1]);
index += 1;
if(index == 6){
state = true;
}
}
if(index == 6){
genPattern(hwMany);"here is the problem"
}
else{
subdivisionN[i] = fractionN;
lengthD[i] = fractionD;
}
}
else{
subdivisionN[i] = fractionN;
lengthD[i] = fractionD;
}
}
}
}
所以我意识到在这个函数中,我编码它的方式,甚至可以在"for 循环"结束之前递归调用。 所以我改成了这个:
function genPattern (hwMany) {
var subdivisionN = new Array();
var lengthD = new Array();
for(var i = 0; i < hwMany; i ++){
if(i == 0) {
genrandSub();
subdivisionN[i] = fractionN;
lengthD[i] = fractionD;
}
else {
var index = 0;
genrandSub();
if(findConvergence (fractionN, fractionD,subdivisionN[i-1], lengthD[i-1]) != true){
var state = false;
while(state == false){
genrandSub();
state = findConvergence (fractionN, fractionD,subdivisionN[i-1], lengthD[i-1]);
index += 1;
if(index == 100){
post("MANY");
post();
break;
}
}
subdivisionN[i] = fractionN;
lengthD[i] = fractionD;
}
else{
subdivisionN[i] = fractionN;
lengthD[i] = fractionD;
}
}
}
if(index == 100){
genPattern(hwMany);"now is in the rigth place"
}
}
现在我可以理解以前的代码是错误的,但我不明白为什么我无论如何都可以运行代码!有人可以评论吗?