Как избежать слишком много рекурсивной ошибки, когда кажется, что нет способа избежать

Я должен уменьшить мою стену текста, что означает, что я не могу объяснить, что такое код. Однако проблема заключается в следующем: этот код генерирует фракции, которые отвечают некоторым требованиям и спецификациям. эти требования приводят к огромному количеству вызовов функции CommonFactor, например 3000000 и более. Я использую этот код javascript внутри max msp, и я могу сгенерировать дробь, но я не могу избежать сообщения об ошибке во многих рекурсивных вызовах. Так что я могу сделать?

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);

javascript,runtime-error,

0

Ответов: 1


0

Привет всем, я решил проблему, но я не могу объяснить причину. То, как я решил проблему, кажется мне логичным, но я бы хотел, чтобы кто-то прокомментировал и объяснил мне лучше. Я хочу узнать больше. Итак, мой предыдущий код у меня был:

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"
	}
}

Теперь я могу понять, что предыдущий код был неправильным, но я не могу понять, почему я мог бы запустить код в любом случае! Кто-нибудь мог бы прокомментировать?

JavaScript, во время выполнения ошибок,
Похожие вопросы