您好,登錄后才能下訂單哦!
本文實(shí)例講述了JS基于遞歸實(shí)現(xiàn)網(wǎng)頁(yè)版計(jì)算器的方法。分享給大家供大家參考,具體如下:
遞歸實(shí)現(xiàn)網(wǎng)頁(yè)版計(jì)算器可以簡(jiǎn)化代碼,設(shè)計(jì)思路:
1、css+html實(shí)現(xiàn)計(jì)算器的外觀,給每個(gè)button綁定number(z)事件,傳入z的不同來(lái)區(qū)分觸發(fā)事件的按鈕。
<style>放入head中
這個(gè)div放在body中,是計(jì)算器的html,number()通過(guò)傳入不同的數(shù)字,區(qū)分觸發(fā)按鈕。
<div class="bg"> <div id="txt"></div> <button id="bt10" value="+">+</button> <button id="bt11" value="-">-</button> <button id="bt12" value="*">*</button> <br data-filtered="filtered"><button id="bt13" value="/">/</button> <button id="bt14" value="=">=</button> <br data-filtered="filtered"><button id="bt1" value="1">1</button> <button id="bt2" value="2">2</button> <button id="bt3" value="3">3</button> <br data-filtered="filtered"><button id="bt4" value="4">4</button> <button id="bt5" value="5">5</button> <button id="bt6" value="6">6</button> <br data-filtered="filtered"><button id="bt7" value="7">7</button> <button id="bt8" value="8">8</button> <button id="bt9" value="9">9</button> </div>
2、在number(z)方法中,利用DOM的innerHTML實(shí)現(xiàn)表達(dá)式的實(shí)時(shí)顯示,并用字符串content存儲(chǔ)已點(diǎn)擊的數(shù)字或符號(hào),當(dāng)點(diǎn)擊"="時(shí),調(diào)用fact(content)進(jìn)行計(jì)算。
代碼如下:
var content; //存儲(chǔ)已點(diǎn)擊的數(shù)字或符號(hào),要定義成全局的,如果定義在number()中,每次content都會(huì)被重新賦值 function number(z) { var k=document.getElementById("txt");//獲取顯示框的 DOM,并緩存在k中 if(z==14){//如果點(diǎn)擊了"="號(hào) var sum = fact(content);//調(diào)用fact()進(jìn)行計(jì)算,并把結(jié)果賦值給sum content=content+"="+sum;//在要顯示的內(nèi)容后加入"="和sum k.innerHTML = content; content = null;//將content清空,準(zhǔn)備下次計(jì)算 }else{ //如果沒(méi)有點(diǎn)擊"="號(hào),而是點(diǎn)擊的運(yùn)算符,就需要通過(guò)switch把數(shù)字轉(zhuǎn)化成運(yùn)算符 switch(z){ case 10: z = '+'; break; case 11: z = '-'; break; case 12: z = '*'; break; case 13: z = '/'; break; } //把此時(shí)輸入的字符存入content if(content){ content+=z.toString(); }else{ content=z.toString(); } k.innerHTML = content;//讓它實(shí)時(shí)顯示 } }
3、本計(jì)算器中遞歸算法的思路:在fact(content)
中,先用content.indexOf("+")
判斷"+"號(hào)是否存在,若存在,則分別遞歸調(diào)用index前后的兩個(gè)字符串,并讓其相加,直到所有串中都找不到"+"后,開(kāi)始用content.lastIndexOf("-")
判斷"-"號(hào),后續(xù)操作和加號(hào)一樣,存在則遞歸index前后的兩個(gè)字符串,并讓其相減,直到找不到減號(hào),就開(kāi)始判斷乘號(hào)和除號(hào),直到?jīng)]有符號(hào)后返回parseFloat(content)
,這里的content是遞歸調(diào)用后的無(wú)符號(hào)字符串,并不是最開(kāi)始引入的參數(shù)了。
//實(shí)現(xiàn)遞歸計(jì)算 function fact(content){ var index = content.indexOf("+");//獲取"+"號(hào)的index if(index != -1){ return fact(content.substring(0,index))+fact(content.substring(index+1)); //當(dāng)找得到“+”號(hào)時(shí),分成兩部分相加遞歸 }else{ var index2 = content.lastIndexOf("-");//當(dāng)找不到“+”號(hào)時(shí),開(kāi)始找“-”號(hào) if(index2 != -1){ return fact(content.substring(0,index2))-fact(content.substring(index2+1)); //當(dāng)找得到“-”號(hào)時(shí),分成兩部分相減遞歸 }else{ var index3 = content.indexOf("*");//當(dāng)找不到“-”號(hào)時(shí),開(kāi)始找“*”號(hào) if(index3 != -1){ return fact(content.substring(0,index3))*fact(content.substring(index3+1)); //當(dāng)找得到“*”號(hào)時(shí),分成兩部分相乘遞歸 }else{ var index4 = content.lastIndexOf("/");//當(dāng)找不到“*”號(hào)時(shí),開(kāi)始找“/”號(hào) if(index4 != -1){ return fact(content.substring(0,index4))/fact(content.substring(index4+1)); //當(dāng)找得到“/”號(hào)時(shí),分成兩部分相除遞歸 }else{ return parseFloat(content);//當(dāng)找不到“/”號(hào)時(shí),返回這段串的變成float型的數(shù)值 } } } } }
以上是全部代碼,設(shè)計(jì)思路中要注意的兩點(diǎn)是:
1、加號(hào)和乘號(hào)用的indexOf()
,而減號(hào)和除號(hào)用的lastIndexOf()
。
舉個(gè)例子:content="3-2-1"
它如果用indexOf()
,先把串分成fact("3")-fact("2-1"),前面"3"無(wú)符號(hào),遞歸調(diào)用fact時(shí)返回parseFloat("3"),而后面的遞歸調(diào)用時(shí),會(huì)變成parseFloat("2")-parseFloat("1")=1,這個(gè)是fact("2-1")的返回值,最終結(jié)果是2,這就相當(dāng)于:3-(2-1)。
如果用lastIndexOf(),它把串分成fact("3-2")-fact("1"),fact("3-2")的返回值是parseFloat("3")-parseFloat("2")=1,這樣就實(shí)現(xiàn)了從左到右的計(jì)算。
除號(hào)也是同理:若content="6/3/2"用indexOf(),相當(dāng)于:6/(3/2),因?yàn)榧犹?hào)和乘號(hào)不存在順序問(wèn)題,因此可以用indexOf()。
2、乘除在判斷的內(nèi)層,加減在判斷的外層。
由于乘除要先計(jì)算,內(nèi)層的判斷會(huì)先獲得沒(méi)有符號(hào)的串,他們就會(huì)先計(jì)算。
這個(gè)計(jì)算器個(gè)人覺(jué)得可以優(yōu)化的地方:(大家也可以思考下)
1、給button綁定事件的時(shí)候,采用事件代理模式。
2、用到的哪些屬性或方法需要考慮瀏覽器兼容問(wèn)題。
本人最開(kāi)始做的是非遞歸的兩個(gè)數(shù)加減乘除的計(jì)算器,后面改進(jìn)的時(shí)候,想做多個(gè)數(shù)的計(jì)算,思考起來(lái)就更復(fù)雜了。當(dāng)采用遞歸來(lái)寫(xiě),代碼量比之前小,易閱讀,并且思考起來(lái)不復(fù)雜。感興趣的可以試一試。
PS:這里再為大家推薦幾款計(jì)算工具供大家進(jìn)一步參考借鑒:
在線一元函數(shù)(方程)求解計(jì)算工具:
http://tools.jb51.net/jisuanqi/equ_jisuanqi
科學(xué)計(jì)算器在線使用_高級(jí)計(jì)算器在線計(jì)算:
http://tools.jb51.net/jisuanqi/jsqkexue
在線計(jì)算器_標(biāo)準(zhǔn)計(jì)算器:
http://tools.jb51.net/jisuanqi/jsq
更多關(guān)于JavaScript相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《JavaScript數(shù)學(xué)運(yùn)算用法總結(jié)》、《JavaScript數(shù)據(jù)結(jié)構(gòu)與算法技巧總結(jié)》、《JavaScript數(shù)組操作技巧總結(jié)》、《JavaScript事件相關(guān)操作與技巧大全》、《JavaScript操作DOM技巧總結(jié)》及《JavaScript字符與字符串操作技巧總結(jié)》
希望本文所述對(duì)大家JavaScript程序設(shè)計(jì)有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。