JS中穷举法和递归的运用
来源:互联网 发布:淘宝商城会员 编辑:程序博客网 时间:2024/06/04 23:24
穷举法
一般代码比较简单,算法也简单。但是计算量很大,尤其没有经过人为的过滤。但是计算机的优势就是运算速度快,所以这个算法扬长避短。可以得到很好的效果。虽然计算机的计算速度快但是也有一定的局限,所以有时候需要我们人为去优化算法,减少计算的次数。
1.百钱买百鸡问题
100元钱如何买100只鸡?
鸡翁一值钱5 鸡母一值钱3 鸡雏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 k = 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 j =1;j<10;j++){
for(var k =1;k<10;k++){
if((i>k)&&(k>j) && (i+j+k ==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 j =1;j<19;j++){
for(var k =1;k<19;k++){
if(i+j+k == 18 &&8*i+6*j+6*k ==118 && 2*j + k==20){
alert("蜘蛛有"+i+"只"+"蜻蜓有"+j+"只"+"蝉有"+k+"只");
}
}
}
}
递归
什么叫递归即函数内部调用本身
递归算法如果按照常规思路去理解,非常复杂,函数调用的嵌套一层套一层。然后一层一层返回。
使用递归的条件,必须要有一个已知的结果
递归实际上是一个降阶问题,将n阶问题转化为n-1阶的问题,也就是去找n和n-1的关系
1.求阶乘问题
var num = Number(prompt("请输入一个数求阶乘"));
function fact(n){
if(n== 1){
return1;
}
return n*fact(n-1);
}
alert(fact(num));
2.汉诺塔问题
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.猴子选大王问题:
一圈猴子,选大王报数,报的数为3就自动退出,直到剩下最后一只猴子当选为大王。
var num = Number(prompt("请输入猴子的个数"));
var king =selectking(num);
alert(king+1);
function selectking(n){
if(1 == 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);
}
递归可以处理所有有规律的数列,但是当我们知道它是数列的时候不建议使用递归,因为递归的效率太低,有时候一些问题不好解释。如果递归能很好地去描述问题,这时可以选择使用递归。
- JS中穷举法和递归的运用
- 穷举法的算法运用
- Js中&&和||的运用
- Js中&&和||的运用
- 全排列:穷举法和递归法
- JAVA穷举法递归实现:查找一个数等于一组数中哪些数相加的和
- JAVA穷举法递归实现:查找一个数等于一组数中哪些数相加的和
- 基于递归的穷举
- js中split和slice的运用
- JS中AOP的实现和运用
- JS中AOP的实现和运用
- 穷举法与递归
- 穷举递归和回溯算法
- 算法-02 递归和穷举
- 用递归和穷举法实现的循环赛赛程生成算法
- 【递归】递归的运用
- oracle中sql的递归查询运用
- treeView和递归的简单运用
- 自定义一个类加载器
- 菜鸟学习数据结构算法之路之斐波那契数列(递归)
- division by zero
- ubuntu16.04+CUDA本地安装+cuDNN本地安装+tensorflow
- (maven学习一) 更新maven工程
- JS中穷举法和递归的运用
- java中Math常用的数学函数
- 微信APP支付java代码【详解】
- Linux的du 和 df 的区别
- 算法训练 P1103
- GDB使用
- 消息日志标准之syslog
- C语言中define与inline的一些小区别和用法
- Linux(Centos6)下安装MySql5.6.38