h5 迭代法、递归、递推、穷举法

来源:互联网 发布:手机淘宝滚动图 编辑:程序博客网 时间:2024/06/06 00:52

迭代法

例:求两个数的最大公约数

辗转相除法:

用较大的数对较小的数取余数,如果余数为0那么最大公约数就是小的那个数。如果不为0那么让除数变为较大的数,余数变为较小的数,继续这样下去直到余数为0.

var num0=Number(prompt("输入一个数"));
var num1=Number(prompt("再输入一个数"));

var res=maxGCD(num0,num1);
alert(res);

function maxGCD(x,y){
    var max=Math.max(x,y);
    var min=Math.min(x,y);
    while(max%min!=0){
        var temp=max%min;
        max=min;
        min=temp;
    }  
    return min;
}

 

这个就叫迭代法:也叫辗转法。

规律:不断的用旧的值去改变新的值,直到想要得到的结果。

套路:

(1)  找到迭代的变量(旧的值)被除数、除数和余数

(2)  确定迭代的关系  直接赋值

(3)  迭代的条件  余数不等于0

作业:求一个数的算术平方根(牛顿法)

var num=Number(prompt("请输入一个数"));
var k=1;
while(Math.abs(k*k-num)>1e-9){
    k=(k+num/k)/2;
}
document.write(k);

 

递推:

兔子产子问题:

一般来说:兔子在出生2个月后就能生崽

一对兔子每个月能生出一对兔子

最开始有一对刚出生的兔子

假设所有的兔子都不死,问一年后多少对兔子

月份

0

1

2

3

4

5

总和

1

1

2

3

5

8

 

var arr=[1,1];
for(vari=2;i<12;i++){
    arr[i]=arr[i-1]+arr[i-2];
}
    alert(arr[11]);

对于递推,最重要的就是找到数学公式,从当前项或当前几项推出下一项。

  猴子摘桃子:一个猴子,第一天摘了若干个桃子当即吃了一半不过瘾有吃了一个。第二天又吃掉剩下的一半,又多吃了2个,第三天还是吃掉一半又多吃了3个,到了第n天发现只剩下一个桃子。请问:第一天摘了多少个?

 var num=Number(prompt("请输入天数"));
var sum=1;
    for(vardays=num;days>0;days--){
        sum=(sum+days)*2;
    }
    alert(sum);

关于存钱的问题:一个富豪,给它的儿子的四年大学生活活期村里一笔钱,富二代每个月只能取3000作为下个月的生活费,年利率是1.71%,富豪一次性要存多少钱?

var money=3000;
for(varmonth=47;month>0;month--){
   
money=money/(1+0.0171/12)+3000;
}
alert(money);

穷举法:

  百钱买白鸡问题

100元钱如何买100只鸡

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

for(varx=0;x<20;x++){
    for (vary =0;y <33;y++){
        if ((100- x -y)==(100- 5 * x- 3 * y) * 3) {
            varz= 100-x-y;

             document.write("鸡翁:"+x+ "&nbsp"+"鸡母:"+y+"&nbsp"+"鸡雏:"+z);
              document.write("</br>");     

  }
    }
}

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

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

法一:

for(varnum0=1;num0<10;num0++){
    for(varnum1=1;num1<10;num1++){
        for(varnum2=1;num2<10;num2++){
            if(num0+num1+num2==num0*num1*num2){
                if(num0>num2&& num2>num1){
                    document.write(num0+num1*10+num2*100);
                }
            }
        }
    }
}

法二:

for(varnum=100;num<1000;num++){
    var a= Math.floor(num/100);//百位
   
var b= Math.floor(num/10) % 10;//十位
   
var c= num %10;//个位
   
if (c> a&&a >b&& (a +b +c) ==a * b*c) {
        var num= a *100+ b *10+ c;
        document.write(num);
    }
}

 

作业:蜘蛛有8条腿,蜻蜓有6条腿和2对翅膀,禅有6条腿和1对翅膀,三种虫子一共有18只,共有118条腿和20对翅膀。问每种虫子各有多少只?

for(varzz=0;zz<14;zz++){
    for(varqt=0;qt<10;qt++){
        for(varc=0;c<19;c++){
            if((zz+qt+c)==18&&(zz*8+qt*6+c*6)==118&& (qt*2+c)==20){
               document.write("蜘蛛:"+zz+"蜻蜓:"+qt+"蝉:"+c+"</br>");
            }
        }
    }
}

 

递归

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

求阶乘问题

Function fact(n){

If(1==n){

Return 1;

}

Return n*fact(n-1);

}

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

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

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

汉诺塔的递归算法

var n=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就自动退出,直到最后一只猴子当选为大王。

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

 

作业:青蛙跳台阶

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

台阶数n

1

2

3

4

5

6  …

跳法

1

2

3

5

8

13  …

var num=Number(prompt("输入总台阶数"));
var arr=[];
 arr[0]=1;arr[1]=2;
for(vari=0;i<num;i++){
    arr[i+2]=arr[i+1]+arr[i];
}
alert(arr[num-1]);

原创粉丝点击