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+ " "+"鸡母:"+y+" "+"鸡雏:"+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]);
- h5 迭代法、递归、递推、穷举法
- 累加、迭代、递推、穷举、递归 ,等运算,笔记
- 算法其实很有趣之——穷举法、递推、递归、分治、概率(算法需有通用性)
- 穷举法与递归
- 四、枚举,递推、迭代法初步学习
- 递推|迭代|穷举案例
- 归并排序-迭代法与递归法
- 快速排序(递归法与迭代法)
- 全排列:穷举法和递归法
- 递归法提升密码穷举算法性能
- 递推与递归
- 递推与递归
- hdu递归,递推
- 递归,递推思想
- 递推与递归
- 递推与递归
- 递归与递推
- 递归和递推
- 用户注册+判断
- json
- APPNIUM安装(此文是根据虫师文章整理而成http://www.cnblogs.com/fnng/p/4552438.html)
- Java pdf转word实例
- 数据结构与算法之八(二叉树)
- h5 迭代法、递归、递推、穷举法
- git连接远程仓库(github)
- ListView分页
- MySql 索引(二)
- vim
- H : 非洲小孩
- HDU2004
- POJ 2676.Sudoku
- 运用UE和Blocks,仅用两周打造一个VR游戏(52VR完整版译文)