JS中穷举法和递归的运用

来源:互联网 发布:淘宝商城会员 编辑:程序博客网 时间:2024/06/04 23:24

穷举法

       一般代码比较简单,算法也简单。但是计算量很大,尤其没有经过人为的过滤。但是计算机的优势就是运算速度快,所以这个算法扬长避短。可以得到很好的效果。虽然计算机的计算速度快但是也有一定的局限,所以有时候需要我们人为去优化算法,减少计算的次数。


1.百钱买百鸡问题

100元钱如何买100只鸡?

鸡翁一值钱鸡母一值钱鸡雏3值钱1

设鸡翁x只,鸡母y只,鸡雏z 只

5x+3y+z/3=100  

X+y+z=100       X<20,y<33


for(var i=0;i<20;i++){
   for(var j=0;j<33;j++){
    var 100-i-j;
    if((100==5*i+3*j+k/3) && k%3==0){
        document.write("鸡翁"+i+"鸡母"+j+"鸡雏"+k+"</br>");
    }
   }
}


2.有一个三位数,个位数字比百位数字大,而百位数字比十位数字大,并且各位数字之和等于各位数字相乘之积。求这个三位数。

for(var i=1;i<10;i++){
    for(var =1;j<10;j++){
        for(var =1;k<10;k++){
            if((i>k)&&(k>j) && (i+j+==i*j*k)){
                document.write(100*k+10*j+i);
            }
        }
    }
}


3.蜘蛛有8条腿,蜻蜓有6条腿和2对翅膀。蝉有6条腿和一对翅膀。

三种虫子一共有18只,共有118条腿和20对翅膀。问每种虫子各有多少只。

for(var i=1;i<14;i++){
    for(var =1;j<19;j++){
        for(var =1;k<19;k++){
            if(i+j+== 18 &&8*i+6*j+6*==118 && 2*k==20){
                alert("蜘蛛有"+i+""+"蜻蜓有"+j+""+"蝉有"+k+"");
            }
        }
    }
}


递归

什么叫递归即函数内部调用本身


递归算法如果按照常规思路去理解,非常复杂,函数调用的嵌套一层套一层。然后一层一层返回。

使用递归的条件,必须要有一个已知的结果

 

递归实际上是一个降阶问题,将n阶问题转化为n-1阶的问题,也就是去找nn-1的关系


1.求阶乘问题

var num = Number(prompt("请输入一个数求阶乘"));
 function fact(n){
     if(n== 1){
         return1;
     }
     return n*fact(n-1);
 }
alert(fact(num));

 

2.汉诺塔问题

var = Number(prompt("请输入木块的个数"));
 var step 0;
 move(n);
alert(step);
 function move(n){
     if(n==1){
         step++;
         return
     
}else{
         move(n-1);
         step++;
         move(n-1);
     }
 }


3.猴子选大王问题:

一圈猴子,选大王报数,报的数为3就自动退出,直到剩下最后一只猴子当选为大王。

var num = Number(prompt("请输入猴子的个数"));
var king =selectking(num);
alert(king+1);
function selectking(n){
    if(== n){
        return0;
    }else{
      return  (selectking(n-1)+3)%n;
    }
}


4.青蛙跳台阶

已知有N个台阶,青蛙一次可以一个台阶也可以跳两个台阶。问总共有多少种跳法。

一只青蛙一次可以跳上1级台阶,也可以跳上2……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。

其实就是斐波那契数列问题。

假设f(n)n个台阶跳的次数。

1.    f(1) = 1

2.    f(2) 会有两个跳的方式,一次1阶或者2阶,

这回归到了问题f(1),f(2) = f(2-1) + f(2-2)

3.   所以,当 f(n)时,得出跳法的规律:

f(n) =f(n-1)+f(n-2)


var num =Number(prompt("请输入台阶阶数"));
var res =frog(num);
alert(res);
function frog(n){
        if(n==1){
            return1;
        }
        if(n==2) {
            return2;
        }
            returnfrog(n-1)+frog(n-2);
        }


       递归可以处理所有有规律的数列,但是当我们知道它是数列的时候不建议使用递归,因为递归的效率太低,有时候一些问题不好解释。如果递归能很好地去描述问题,这时可以选择使用递归。

原创粉丝点击