您的位置:首页 > 其它

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

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的关系。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: