您好,登錄后才能下訂單哦!
這篇文章主要講解了“JavaScript遞歸是什么及怎么用”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“JavaScript遞歸是什么及怎么用”吧!
我們先來看一下遞歸(recursion)的定義:
遞歸是一種解決問題的有效方法,在遞歸過程中,函數將自身作為子例程調用。
簡單說程序調用自身的編程技巧叫遞歸。遞歸的思想是把一個大型復雜問題層層轉化為一個與原問題規模更小的問題,問題被拆解成子問題后,遞歸調用繼續進行,直到子問題無需進一步遞歸就可以解決的地步為止。
使用遞歸需要避免出現死循環,為了確保遞歸正確工作,遞歸程序應該包含2個屬性:
基本情況(bottom cases),基本情況用于保證程序調用及時返回,不在繼續遞歸,保證了程序可終止。
遞推關系(recurrentce relation),可將所有其他情況拆分到基本案例。
函數中自己調用自己就是遞歸,切記要有終止條件,不然進入死循環
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
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
let data = [{ id: "01", pid: "", "name": "老王" }, { id: "02", pid: "01", "name": "小張" } ]
function fn(data, rootId = "") { const children = [] //定義一個空數組 data.forEach(item => { if (item.pid === rootId) { //如果每一項的pid=rootId就添加到數組里 children.push(item) item.children = fn(data, item.id) } }); return children }
使用遞歸轉樹 要知道根的pid是什么值才能進行下一步操作,作為起點。
執行順序
規則 下面三個柱子分別設為 a 、b、 c、 目標把a中的所有盤子分別從大到小依次放到c柱子中,每次只能移動一個盤子
實現思路:
將n-1個盤子從a挪到b
將n盤子從a挪到c
將n-1個盤子從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作為盤子的數量 start 作為a盤子 middle作為b盤子 end作為c盤子
例如 2個盤子的執行順序
1.第一行 把2帶進去 num>0 執行第一個函數fn(2-1,start,end,middle) 又去執行了fn(1-1,start,end,middle) 發現num不大于0不僅如此if條件,回過來看 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) 進入不了循環執行完畢
執行順序有點抽象,實在不理解就按照最簡單的思路去做 fn(num, start, middle, end) ,平常我們玩游戲怎么玩就去怎么做,初始圖
fn(num-1,start,middle,end) 把 第二個的參數位置作為要移動的盤子 把第四個的參數位置作為移動目標 每次看圖把這個公式帶進去
第一步 fn(num-1,start,end,middle) 例如兩個盤子 肯定是先把a-1放到b上
第二步 把盤子a放c上直接輸出 console.log("a===>c")
第三步 把盤子b放c上 fn(num-1,middle,start,end,)
斐波那契數列(Fibonacci sequence),又稱黃金分割數列,因數學家萊昂納多?斐波那契(Leonardoda Fibonacci)以兔子繁殖為例子而引入,故又稱為“兔子數列”,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、
function Fibonacci(n) { return n <= 1?1:Fibonacci(n - 1) + Fibonacci(n - 2) }
除了前兩個 每次都是前一個數和前兩個數的和相加等于第三個數
例如數字5舉例 前一項是3 前兩項是2 3+2=5
感謝各位的閱讀,以上就是“JavaScript遞歸是什么及怎么用”的內容了,經過本文的學習后,相信大家對JavaScript遞歸是什么及怎么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。