溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

JS基于遞歸實(shí)現(xiàn)網(wǎng)頁(yè)版計(jì)算器的方法分析

發(fā)布時(shí)間:2020-10-13 13:21:54 來(lái)源:腳本之家 閱讀:160 作者:遠(yuǎn)方1234567 欄目:web開(kāi)發(fā)

本文實(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ì)有所幫助。

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI