累加、迭代、递推、穷举、递归 ,等运算,笔记

8、计算

 

8.1累加:

累加:将一系列的数据加到一个变量里面,最后得到了累加的结果。

 

一般形式:

累加:V+=e;

累积:V*=e;

V代表累加和累积,e代表累加累积项。

算法要点:

1.    初始化V

累加:V=0;

累积:V=1;

e的初始化,如果累加项/积项比较复杂,可能会分解为几个子项分别初始化,比如圆周率的问题,累加项分解为符号、分子和分母三部分。

2.    循环的控制条件:

   1)固定次数的,比如说计算弹跳距离的问题,计算前二十项的和的问题。次数不固定而是要满足某个条件:计算圆周率的问题求最后一项的绝对值要小于10-6   。

 

3.    确定累加、积项的变化

比如数列的前20项之和,是将当前分子分母之和作为下次的分母,当前的分母比作分子。

再比如求圆周率的问题,是将符号取反、分母加2,然后的处下一项。

 

比如:小球从高处落下,每次返回到原来的一半,求第十次小球落地的总过程

var h=100;
var s=0;
for(var i=0;i<10;i++){
    h=h/2;
    s+=h
}
s=s*2+100;
alert(s);

 

 

累积:将一些列的数据乘积积到一个变量里。

/*累积*/
var n=100;
var s=1;
for(var i=0;i<100;i++){
    s*=i
}

 

 

 

 

8.2迭代

迭代法也叫辗转法

规律:就是可以不断地用旧的值去得到新的值,直到我们想要得到的结果。遇到迭代的问题怎么解决:

(1)找到迭代的变量(旧的值)

(2)确定迭代的关系

(3)知道想要的结果是什么(结束循环条件)

1)         直到最终的结果

2)         循环的次数

* 1.判断两个数的大小,将大的给num1,小的给num2
* 2.如果num1对num2取余为0,那么num2就是最大公约数
* 3.否则把num2的值给num1,将num1,num2的余数赋给num2,再次重来
* 4.最终得到最大公因数。

function GCD(num1,num2){
    if(num1<num2){
        var t=num1;
        num1=num2;
        num2=t;
    }
    var remainder=num1%num2;
    while(remainder!=0){
        num1=num2;
        num2=remainder;
        remainder=num1%num2;
    }
            return num2;;
}

 

8.3递推

      解决思路:

             找到数学规律,通过公示计算下一项的值,一直找到我们想要的结果为止。

例如:兔子产子:通过前两项得到下一项。

/*方法二:*/
var rabbit = [1, 1];
for (var m = 2; m <= month; m++) {
    rabbit[m] = rabbit[m - 1] + rabbit[m - 2];
}
alert(rabbit[month]);

8.4穷举

遇到一个问题,找不到数学公式或者规律时(解决办法),使用最“笨”的方法,利用计算机的计算速度快的特点,将所有可能性全部列出来,并将我们想要的结果记录下来。

如下例

/*
 * 一只公鸡5块,母鸡三块,鸡娃三只一块。
 * 买一百只鸡,一百块钱,公鸡、母鸡、小鸡各多少?
 * */
for (var cock = 0; cock < 20; cock++) {
    for (var hen = 0; m < 33; m++) {
        var chicken = 100 - cock - m;
        if (100 == cock * 5 + m * 3 + chicken/ 3) {
            document.write("公鸡:" + cock + "" + "母鸡:" + m + "" + "鸡娃:" + chicken+ "<br>")
        }
    }
}

穷举的方法的特点就是简单,但是计算量往往是很大的。但计算机的优势就是计算快,所以这个算法可以扬长避短,往往可以取得不错的效果。

案例:有一位三位数,个位数字比百位大,百位数字比十位答,并且各位数字之和等于各位数字相乘之积,求此三位数。

 

8.5递归

 

所谓的递归,就是在函数内部又去掉自己。

例如求阶乘问题:在fact函数内部去调用fact函数。

/*
*
计算N的阶乘
* */
function fact(n){
    if(1==n){
        return 1;
    }
    return n*fact(n-1);
}
alert(fact(5));

递归计算法如果按照常规思路去理解是非常复杂的,函数一层一嵌套调用,然后又一城一成返回。不妨换个思路去理解递归。

递归实际上就是将规模为n的问题降阶为n-1的问题进行求解。也就是去找n和n-1之间的的关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值