累加和累积
累加:将一系列的数据加到一个变量里面。最后的得到累加的结果
比如:将1到100的数求累加和
小球从高处落下,每次返回到原来一半,求第十次小球落地时小球走过的路程
var h=100;
var s=0;
for(var i&#61;0;i<10;i&#43;&#43;){
h&#61;h/2;
s&#43;&#61;h;
}
s&#61;s*2&#43;100;
累积&#xff1a;将一系列的数据乘积到一个变量里面&#xff0c;得到累积的结果。
常见的就是n的阶乘
var n&#61;100;
var result&#61; 1;
for(var i&#61;1;i<&#61;n;i&#43;&#43;){
result*&#61;i;
}
一般形式&#xff1a;
累加&#xff1a;V &#43;&#61;e;
累积&#xff1a;v*&#61;e&#xff1b;
V代表累加和累积&#xff0c;e代表累加/累积项
算法要点&#xff1a;
(1) 初始化
初始化v和e
累加&#xff1a;v &#61; 0&#xff1b;
累积&#xff1a;v &#61; 1&#xff1b;
e的初始化&#xff0c;如果累加/积项比较复杂&#xff0c;可能会分解为几个子项分别初始化&#xff0c;比如计算圆周率的问题&#xff0c;累计项分解为符号、分子和分母三部分。
(2) 循环的控制条件
一种是固定的次数&#xff0c;比如计算弹跳距离的问题&#xff0c;计算数列前20项之和的问题&#xff0c;
次数不固定&#xff0c;而是要满足某个条件&#xff1a;计算圆周率问题要求最后一项的绝对值&#xff0c;要小于10-6。
(3) 确定累加/积项的变化
比如数列的前20项之和&#xff0c;是将当前的分子分母之和作为下一次的分母&#xff0c;当前的分母作为分子。
再比如求圆周率问题&#xff0c;是将符号取反、分母加2&#xff0c;然后的出下一项。
迭代
迭代法也就是辗转法
规律&#xff1a;就是可以不断地用旧的值得到新的值&#xff0c;直到我们想要的得到的结果。
遇到了迭代的问题怎么解决
1. 找到迭代的变量(旧的值)
2. 确定迭代的关系
3. 知道想要的结果是什么(结束循环的条件)
(1) 就是知道最终结果
(2) 循环的次数
/*
* 1.接受用户输入的俩个数
* 2.一个函数的到最大公约数
* 3.打印这个最大公约数*/
varnum1 &#61; Number(prompt("请输入一个数"));
var num2 &#61; Number(prompt("请输入一个数"));
var result &#61; GCD(num1,num2);
alert(result);
/*
* 函数的功能&#xff1a;得到最大公约数
* 函数名&#xff1a;GCD
* 函数的参数&#xff1a;俩个整数
* 返回值&#xff1a;最大公约数*/
/*
* 如果num1
* 计算余数
* 当num1(除数)&#xff0c;对num2(被除数)的余数不为0&#xff0c;重复一下步骤
* num2&#61;>num1,
* 余数&#61;>num2
* 重新计算余数
* 最终的到最大公约数&#xff0c;也就是num2的值*/
functionGCD(num1,num2){
/*return0;*/
if(num1
var t &#61; num1;
num1&#61;num2;
num2 &#61; t;
}
var remainder &#61; num1%num2;
while(remainder!&#61; 0){
num1&#61;num2;
num2&#61; remainder;
remainder&#61;num1%num2;
}
returnnum2;
}
递推
找到数学规律&#xff1a;通过公式计算到下一项的值&#xff0c;一直到我们要的结果为止
例如&#xff1a;兔子产子&#xff1a;通过前俩项得到下一项
/*
* 一般而言&#xff0c;兔子在出生俩个月后&#xff0c;就有繁殖能力
* 一对兔子每个月能生出一对小兔子来
* 如果所有的兔子都不死&#xff0c;那么一年以后总共有多少对兔子*/
/*
* 月份 0 1 2 3 4 5 6
* 幼崽 1 1 1 2 3 5 8
* 成年 0 0 1 1 2 3 5
* 总共 1 1 2 3 5 8 13
* */
/*
* 接收用户输入的月份
* 计算兔子的对数
* (1)如果经过的月份<2那么兔子的对数为1
* (2)否则用初始的兔子的对数 加上 第一个月的对数为
* 第二个月兔子的个数(an &#61; an-1 &#43;an-2)
* 反复使用这个公式&#xff0c;计算出下个月兔子的个数一直到用户输入的月份为止
* 打印的兔子的对数
* */
/* var month &#61; Number(prompt("输入月份"));
var sum ;
var an &#61;1;
var an_1&#61;1;
var an_2;
if(month <2){
sum&#61;1;
}else{
sum&#61;2;
for(var i&#61;1; i
sum&#61; an &#43;an_1;
an_1 &#61;an;
an &#61; sum;
}
}
alert(sum);*/
/*
* 思路2*/
varmonth &#61; Number(prompt("输入月份"));
var rabbit &#61; [1,1];
for(varm&#61;2;m<&#61;month;m&#43;&#43;){
rabbit[m]&#61;rabbit[m-1]&#43;rabbit[m-2];
}
alert(rabbit[month]);
递推分为顺推和逆推。
穷举
遇到一个问题&#xff0c;找不到更好的解决办法&#xff0c;(找不到数学公式或者规律)时&#xff0c;使用“最笨”的办法&#xff0c;利用计算机计算速度快的特点&#xff0c;将所有可能性全部列出来
并将我们想要得到的结果记录下来
script>
/*
* 公鸡一值钱5&#xff0c;鸡母一值钱三&#xff0c;鸡仔三值钱一
* 百钱买百鸡&#xff0c;问公鸡&#xff0c;鸡母、鸡仔各几何&#xff1f;
* x y z
* x &#43; y &#43; z &#61; 100
* x*5 &#43; y * 3 &#43; z/3 &#61; 100*/
for(varcock&#61;0;cock<&#61;20;cock&#43;&#43;){
for(varhen&#61;0;hen<&#61;33;hen&#43;&#43;){
var chihen&#61;100-cock-hen;
if(100&#61;&#61; cock*5&#43; hen*3&#43; chihen/3){
document.write("公鸡一共&#xff1a;"&#43;cock&#43;"鸡母一共&#xff1a;"&#43;hen&#43;"小鸡一共&#xff1a;"&#43;chihen&#43;"
")
}
}
}
穷举方法的特点&#xff1a;是算法简单&#xff0c;相应的程序也简单&#xff0c;但是计算量往往很大。但是计算机的优势就是运算速度快&#xff0c;所以此算法可以扬长避短&#xff0c;往往可以取得不错的效果。
案例&#xff1a;有一个三位数&#xff0c;个位数字比百位数字大&#xff0c;而百位数字又比十位数字大&#xff0c;并且各位数字之和等于各位数字相乘之积&#xff0c;求此三位数
递归
所谓递归&#xff0c;就是在函数内部又去调用自己。
例如&#xff0c;求阶乘问题&#xff0c;在fact函数内部又去调用fact函数了
/*计算n的阶乘*/
functionfact(n){
if(1&#61;&#61; n){
return1
}
returnn*fact(n-1);
}
alert(fact(5));
递归算法如果按照常规思路去理解是非常复杂的&#xff0c;函数调用一层一层嵌套调用&#xff0c;然后又一层一层返回&#xff0c;不妨换个思路去理解递归。
递归实际上就是将规模为n的问题降价为n-1的问题进行求解。也就是去找n和n-1之间的关系。
总结
以上就是这篇文章的全部内容了&#xff0c;希望本文的内容对大家的学习或者工作具有一定的参考学习价值&#xff0c;谢谢大家对脚本之家的支持。如果你想了解更多相关内容请查看下面相关链接