常见算法—累积累加、迭代、递推、递归

累加/累积

一般形式:

累加: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 0;
       
if(num1<num2){
           
num2;
           
num2 num1;
           
num1 m;
       
}

      
while(num1%num2!=0){
            
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的关系。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值