累加/累积
一般形式:
累加:v+=e;
累计:v*=e;
算法要点:
1)初始化
初始化v和e
累加:v=0;
累积:v=1;
E的初始化,如果累加/积项比较复杂,可能会分解为几个子项分别初始化,比如计算圆周率的问题,累加项分解为符号、分子可分母三部分。
2)循环的控制条件
一种是固定次数,比如计算弹跳距离的问题、计算数列前20项之和的问题
次数不固定,而是要满足某个条件:计算圆周率问题要求最后一项的绝对值要小于10负6次方。
3)确定累加/积项的变化
比如数列的前20项之和,
2迭代
迭代法规律:就是可以不断的用旧的值去得到新的值,直到我们想要得到的结果。
遇到了迭代的问题咋解决?
1) 找到迭代的变量(旧的值)
2) 确定迭代的关系
知道想要的结果是什么(结束循环的条件)
就是知道最终结果
②循环次数
var num1 =Number(prompt("请输入一个数"));
var num2 = Number(prompt("请输入一个数"));
var result = gcd(num1,num2);
var g=(unm1*num2)/result;
alert(g);
function gcd(num1,num2){
var m = 0;
if(num1<num2){
m = num2;
num2 = num1;
num1 = m;
}
while(num1%num2!=0){
m = num1%num2;
num1 = num2;
num2 = m;
}
return num2;
}
递推和逆推
3递推
解决思路:找到数学规律,通过公式计算到下一项的值,一直到我们要的结果为止,例如:兔子产子:通过前两项得到下一项
/*
* 一般而言,兔子在出生两个月后,就有繁殖能力
* 一对兔子每个月能生出一对小兔子啊
* 如果所有兔子都不死,那么一年以后总共有多少对兔子?
* */
/*
* 月份 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
* */
var month = Number(prompt("请输入月份"));
var rabbit = [1,1];
for(var m =2;m<=month;m++){
rabbit[m] = rabbit[m-1]+rabbit[m-2];
}
alert(rabbit[month]);
4穷举
找不到更好解决办法时(找不到数学公式或者规律),使用穷举全部列举出来,找到我想要的结果!
穷举方法的特点是简单,相应
5递归
所谓递归,就是在函数内部又去调用自己。
例如,求阶乘问题,在fact函数内部又去调用fact函数了
/*
* 计算n的阶乘
* */
function fact(n){
if(1==n){
return n;
}
return n*fact(n-1)
}
alert(fact(5));
递归算法如果按照常规思路去理解是非正常复杂的,函数调用一层一层嵌套调用,然后又一层层返回。不妨换个思路去理解递归。
递归实际上就是将规模为n的问题降阶为n-1的问题去找n和n-1的关系。