当似乎没有办法避免时,如何避免太多的递归错误



我必须减少我的文字墙,这意味着我无法解释代码的内容。但问题是: 此代码生成满足某些要求和规范的分数。 此要求导致函数 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"
	}
}

现在我可以理解以前的代码是错误的,但我不明白为什么我无论如何都可以运行代码!有人可以评论吗?

最新更新