這次帶給大家JS常用演算法累加、迭代、窮舉、遞歸實作(附程式碼),JS常用演算法累加、迭代、窮舉、遞歸的注意事項有哪些,下面就是實戰案例,一起來看一下。
累加與累積
累加:將一連串的資料加到一個變數裡面。最後的得到累加的結果
例如:將1到100的數求累加和
小球從高處落下,每次回到原來一半,求第十次小球落地時小球走過的路程
<script> var h=100; var s=0; for(var i=0;i<10;i++){ h=h/2; s+=h; } s=s*2+100; </script>
累積:將一連串的資料乘積到一個變數裡面,得到累積的結果。
常見的就是n的階乘
var n=100; var result= 1; for(var i=1;i<=n;i++){ result *=i; }
一般形式:
累加:V =e;
累積:v*=e;
V代表累加和累積,e代表累加/累積項目
演算法要點:
(1)初始化
初始化v和e
累加:v = 0;
累積:v = 1;
e的初始化,如果累加/積項比較複雜,可能會分解為幾個子項分別初始化,例如計算圓周率的問題,累計項分解為符號、分子、分母三部分。
(2)循環的控制條件
一種是固定的次數,例如計算彈跳距離的問題,計算數列前20項總和的問題,
次數不固定,而是要滿足某個條件:計算圓周率問題要求最後一項的絕對值,要小於10-6。
(3)確定累加/積項的變化
例如數列的前20項之和,是將當前的分子分母之和作為下一次的分母,當前的分母作為分子。
再例如求圓周率問題,是將符號取反、分母加2,然後的出下一項。
迭代
迭代法也就是輾轉法
規律:就是可以不斷地用舊的值得到新的值,直到我們想要的得到的結果。
遇到了迭代的問題怎麼解決
1. 找到迭代的變數(舊的值)
2. 確定迭代的關係
3.知道想要的結果是什麼(結束迴圈的條件)
(1)就是知道最終結果
(2)迴圈的次數
<script> /* * 1.接受用户输入的俩个数 * 2.一个函数的到最大公约数 * 3.打印这个最大公约数*/ var num1 = Number(prompt("请输入一个数")); var num2 = Number(prompt("请输入一个数")); var result = GCD(num1,num2); alert(result); /* * 函数的功能:得到最大公约数 * 函数名:GCD * 函数的参数:俩个整数 * 返回值:最大公约数*/ /* * 如果num1<num2则交换,确保num1是交大的 * 计算余数 * 当num1(除数),对num2(被除数)的余数不为0,重复一下步骤 * num2=>num1, * 余数=>num2 * 重新计算余数 * 最终的到最大公约数,也就是num2的值*/ function GCD(num1,num2){ /*return0;*/ if(num1<num2){ var t = num1; num1=num2; num2 = t; } var remainder = num1%num2; while(remainder!= 0){ num1=num2; num2= remainder; remainder=num1%num2; } returnnum2; } </script>
遞推
找到數學法則:透過公式計算到下一項的值,一直到我們要的結果為止
例如:兔子產子:經由前倆項得到下一項
<script> /* * 一般而言,兔子在出生俩个月后,就有繁殖能力 * 一对兔子每个月能生出一对小兔子来 * 如果所有的兔子都不死,那么一年以后总共有多少对兔子*/ /* * 月份 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 * */ /* * 接收用户输入的月份 * 计算兔子的对数 * (1)如果经过的月份<2那么兔子的对数为1 * (2)否则用初始的兔子的对数 加上 第一个月的对数为 * 第二个月兔子的个数(an = an-1 +an-2) * 反复使用这个公式,计算出下个月兔子的个数一直到用户输入的月份为止 * 打印的兔子的对数 * */ /* var month = Number(prompt("输入月份")); var sum ; var an =1; var an_1=1; var an_2; if(month < 2){ sum=1; }else{ sum=2; for(var i=1; i<month; i++){ sum= an +an_1; an_1 =an; an = sum; } } alert(sum);*/ /* * 思路2*/ 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]); </script>
遞推分為順推和逆推。
窮舉
遇到一個問題,找不到更好的解決方法,(找不到數學公式或規律)時,使用「最笨」的辦法,利用計算機計算速度快的特點,將所有可能性全部列出來
並將我們想要得到的結果記錄下來
<script> /* * 公鸡一值钱5,鸡母一值钱三,鸡仔三值钱一 * 百钱买百鸡,问公鸡,鸡母、鸡仔各几何? * x y z * x + y + z = 100 * x*5 + y * 3 + z/3 = 100*/ for(var cock=0;cock<=20;cock++){ for(var hen=0;hen<=33;hen++){ var chihen=100-cock-hen; if(100== cock*5+ hen*3+ chihen/3){ document.write("公鸡一共:"+cock+"鸡母一共:"+hen+"小鸡一共:"+chihen+"<br>") } } } </script>
窮舉方法的特點:是演算法簡單,對應的程式也簡單,但是計算量往往很大。但是計算機的優點就是運算速度快,所以此演算法可以揚長避短,往往可以達到不錯的效果。
案例:有一個三位數,個位數字比百位數字大,而百位數字又比十位數字大,並且各位數字之和等於各位數字相乘之積,求此三位數
遞迴
所謂遞歸,就是在函數內部又去呼叫自己。
例如,求階乘問題,在fact函數內部又去調用fact函數了
<script> /*计算n的阶乘*/ function fact(n){ if(1== n){ return 1 } return n*fact(n-1); } alert(fact(5)); </script>
遞歸演算法如果按照常規思路去理解是非常複雜的,函數調用一層一層嵌套調用,然後又一層一層返回,不妨換個思路去理解遞歸。
相信看了本文案例你已經掌握了方法,更多精彩請關注php中文網其它相關文章!
推薦閱讀:
#########以上是JS常用演算法累加、迭代、窮舉、遞歸實現(附程式碼)的詳細內容。更多資訊請關注PHP中文網其他相關文章!