常见算法—累积累加、迭代、递推、递归
2017-08-08 08:32
986 查看
累加/累积
一般形式:
累加: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的关系。
一般形式:
累加: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的关系。
相关文章推荐
- JS常见算法-累加/累积
- 累加、迭代、递推、穷举、递归 ,等运算,笔记
- JavaScript累加、迭代、穷举、递归等常用算法实例小结
- 斐波那契两种算法(递归,迭代规划)
- 程序算法艺术与实践:递归策略之递归,循环与迭代
- 【Jason's_Knowledge】算法竞赛中的递归与迭代及其延伸内容简述
- 五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)
- (区别)递归与迭代&&递归与递推&&迭代与递推
- C++之实现两个链表合并(迭代和递归版本)(19)---《那些奇怪的算法》
- 算法之递归,迭代,动态规划,分冶
- 三种常用算法概述——遍试、迭代、递归
- 五类常见算法小记 (递归与分治,动态规划,贪心,回溯,分支界限法)
- 数据结构与算法学习笔记——二叉树遍历(一)(递归、迭代)
- 常见Java面试题 :迭代(iteration)和递归(recursion)
- 三种常用算法概述——遍试、迭代、递归
- 【数据结构与算法】深入浅出递归和迭代的通用转换思想
- 常见Java面试题 :迭代(iteration)和递归(recursion)
- 循环(迭代/递推)与递归
- JS常见算法-迭代
- 【数据结构与算法】深入浅出递归和迭代的通用转换思想