国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

關(guān)于JavaScript遞歸經(jīng)典案例題詳析

發(fā)布時(shí)間:2021-08-17 12:16 來(lái)源: 閱讀:0 作者:奧特曼 欄目: JavaScript 歡迎投稿:712375056

目錄

          什么是遞歸,它是如何工作的?

          我們先來(lái)看一下遞歸(recursion)的定義:

          遞歸是一種解決問(wèn)題的有效方法,在遞歸過(guò)程中,函數將自身作為子例程調用。

          簡(jiǎn)單說(shuō)程序調用自身的編程技巧叫遞歸。遞歸的思想是把一個(gè)大型復雜問(wèn)題層層轉化為一個(gè)與原問(wèn)題規模更小的問(wèn)題,問(wèn)題被拆解成子問(wèn)題后,遞歸調用繼續進(jìn)行,直到子問(wèn)題無(wú)需進(jìn)一步遞歸就可以解決的地步為止。

          使用遞歸需要避免出現死循環(huán),為了確保遞歸正確工作,遞歸程序應該包含2個(gè)屬性:

          1. 基本情況(bottom cases),基本情況用于保證程序調用及時(shí)返回,不在繼續遞歸,保證了程序可終止。
          2. 遞推關(guān)系(recurrentce relation),可將所有其他情況拆分到基本案例。

          函數中自己調用自己就是遞歸,切記要有終止條件,不然進(jìn)入死循環(huán)     

          一、求和

          (1)數字求和

              function sum(n){
                if(n===1){
                  return n=1
                }
                return n+sum(n-1)
              }
              console.log(sum(5));

           執行順序

          5+sum(n-1)
          5+4+sum(n-1)
          5+4+3+sum(n-1)
          5+4+3+2sum(n-1)
          5+4+3+2+1

          (2)數組求和

                  function sum(arr) {
                  var len = arr.length
                  if (len == 0) {
                    return 0
                  } else if (len == 1) {
                    return arr[0]
                  } else {
                    return arr[0] + sum(arr.slice(1))
                  }
                }
                let arr = [ 1, 2, 3, 4, 5 ]  
                console.log(sum(arr))

          執行順序

          1+sum(2,3,4,5)
          1+2+sum(3,4,5)
          1+2+3(4,5)
          1+2+3+4+sum(5)
          1+2+3+4+5
          1+2+3+9
          1+2+12
          1+14
          15

          二、數據轉樹(shù)

                  let data = [{
                          id: "01",
                          pid: "",
                          "name": "老王"
                      },
                      {
                          id: "02",
                          pid: "01",
                          "name": "小張"
                      }
                  ]
            function fn(data, rootId = '') {
                      const children = []      //定義一個(gè)空數組
                      data.forEach(item => {
                          if (item.pid === rootId) {    //如果每一項的pid=rootId就添加到數組里
                              children.push(item)
                              item.children = fn(data, item.id)
                          }
                      });
                      return children
                  }

          使用遞歸轉樹(shù) 要知道根的pid是什么值才能進(jìn)行下一步操作,作為起點(diǎn)。

          執行順序

          三、漢諾塔

          規則 下面三個(gè)柱子分別設為 a 、b、 c、 目標把a中的所有盤(pán)子分別從大到小依次放到c柱子中,每次只能移動(dòng)一個(gè)盤(pán)子

          實(shí)現思路:

          1. 將n-1個(gè)盤(pán)子從a挪到b
          2. 將n盤(pán)子從a挪到c
          3. 將n-1個(gè)盤(pán)子從b挪到c
                  function fn(num, start, middle, end) {   
                      if(num>0){
                          fn(num-1,start,end,middle)
                          console.log(start+'====>'+end); 
                          fn(num-1,middle,start,end)
                      }
                     }
                        fn(2,'a','b','c')

          把  num作為盤(pán)子的數量  start 作為a盤(pán)子  middle作為b盤(pán)子   end作為c盤(pán)子  

          例如 2個(gè)盤(pán)子的執行順序

          1.第一行 把2帶進(jìn)去 num>0  執行第一個(gè)函數fn(2-1,start,end,middle) 又去執行了fn(1-1,start,end,middle) 發(fā)現num不大于0不僅如此if條件,回過(guò)來(lái)看 fn(2-1,start,end,middle) ,輸出 console.log(a===>b) 

          2.第二行console.log(start+'====>'+end);   直接輸出 a===>c

          3.第三行 fn(2-1,middle,start,end)  執行 console.log(b===>c)  下次再去執行  fn(1-1,middle,start,end) 進(jìn)入不了循環(huán)執行完畢

          執行順序有點(diǎn)抽象,實(shí)在不理解就按照最簡(jiǎn)單的思路去做 fn(num, start, middle, end) ,平常我們玩游戲怎么玩就去怎么做,初始圖

          fn(num-1,start,middle,end)  把 第二個(gè)的參數位置作為要移動(dòng)的盤(pán)子 把第四個(gè)的參數位置作為移動(dòng)目標    每次看圖把這個(gè)公式帶進(jìn)去 

          第一步   fn(num-1,start,end,middle)   例如兩個(gè)盤(pán)子 肯定是先把a-1放到b上  

          第二步 把盤(pán)子a放c上直接輸出 console.log('a===>c')

          第三步 把盤(pán)子b放c上  fn(num-1,middle,start,end,) 

          四、斐波那契數列

          斐波那契數列(Fibonacci sequence),又稱(chēng)數列,因數學(xué)家萊昂納多·斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱(chēng)為“”,指的是這樣一個(gè)數列:0、1、1、2、3、5、8、13、21、34、

                  function Fibonacci(n) {
                      return  n <= 1?1:Fibonacci(n - 1) + Fibonacci(n - 2)
                  }

          除了前兩個(gè) 每次都是前一個(gè)數和前兩個(gè)數的和相加等于第三個(gè)數 

          例如數字5舉例  前一項是3  前兩項是2    3+2=5   

          總結

          到此這篇關(guān)于JavaScript遞歸經(jīng)典案例題詳析的文章就介紹到這了,更多相關(guān)JavaScript遞歸案例內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

          免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

          日本免费一区二区三区在线播放| 亚洲国产精品VA在线观看麻豆| 色翁荡息又大又硬又粗又视频软件| 国产日韩精品欧美一区| 国产精品天干天干综合网| 中文字幕一区二区三区精华液|