本身递归就大量使用栈操作,如果是处理已知规模的问题,其运算效率就可以预估,但是如果递归的条件为随机(结果确定),怎样优化才能提高效率呢?
以下是我对一个js生成5组4位数问题递归效率的分析:
function genRamdomBox4Result(){
nums = genBox4RandomNumber();
nums2 = genBox4RandomNumber();
nums3 = genBox4RandomNumber();
nums4 = genBox4RandomNumber();
nums5 = genBox4RandomNumber();
var temp =’’;
//任意两组数不等的概率为:1-1/(81*81),五组数都不等的概率为:1-1/(9^12),及进行递归的概率为1/(9^12)几乎为0?
if(checkTwoBox4NumDifferent(nums,nums2)&&checkTwoBox4NumDifferent(nums,nums3)
&&checkTwoBox4NumDifferent(nums,nums4)&&checkTwoBox4NumDifferent(nums,nums5)
&&checkTwoBox4NumDifferent(nums2,nums3)&&checkTwoBox4NumDifferent(nums2,nums4)
&&checkTwoBox4NumDifferent(nums3,nums4)&&checkTwoBox4NumDifferent(nums4,nums5) ){
temp = nums+”,”+nums2+”,”+nums3+”,”+nums4+”,”+nums5;
return temp;
}else{
genRamdomBox4Result();
}
}
function checkTwoBox4NumDifferent(a,b){
if(a.length > 3 && b.length > 3){
if(a==b){
return false;
}
return true;
}
return false;
}
function genRandomNumber(numAmount){
if(numAmount>0){
var temp=’’;
for(var i=0;i<numAmount;i++){
temp = temp + String(Math.floor(Math.random()*10));
}
return temp;
}
}
function genBox4RandomNumber(){
var result = ‘’;
var temp1 = String(Math.floor(Math.random()10));
var temp2 = String(Math.floor(Math.random()10));
//这里temp1<temp2的概率为1/3,所以每次有2/3的可能会重新进行递归,可以修正其为
/if(temp1<temp2){…}else if(temp1>temp2){…}{
result = genBox4RandomNumber();
}/这样每次运算进行递归的概率为1/3
if(temp1<temp2){
var judge = Math.floor(Math.random()*10);
if(judge>5){
result = temp1+temp1+temp1+temp2;
}else{
result = temp1+temp2+temp2+temp2;
}
}else{
result = genBox4RandomNumber();
}
return result;
}
所以可以得出,控制概率的值,可以控制递归事件发生的频率,本质上减少了递归的发生。