幾種常見的JS遞迴演算法

lzg9527發表於2019-12-05

遞迴的概念

就是函式自己呼叫自己本身,或者在自己函式呼叫的下級函式中呼叫自己。

遞迴的步驟

  1. 假設遞迴函式已經寫好
  2. 尋找遞推關係
  3. 將遞推關係的結構轉換為遞迴體
  4. 將臨界條件加入到遞迴體中

經典案例 1: 求和

求 1-100 的和

function sum(n) {
  if (n == 1) return 1
  return sum(n - 1) + n
}
複製程式碼

經典案例 2: 斐波拉契數列

1,1,2,3,5,8,13,21,34,55,89...求第 n 項

// 遞迴方法
function fib(n) {
  if (n === 1 || n === 2) return n - 1
  return fib(n - 1) + fib(n - 2)
}
console.log(fib(10)) // 34

//非遞迴方法 //
function fib(n) {
  let a = 0
  let b = 1
  let c = a + b
  for (let i = 3; i < n; i++) {
    a = b
    b = c
    c = a + b
  }
  return c
}
console.log(fib(10)) // 34
複製程式碼

經典案例 3: 爬樓梯

JS 遞迴 假如樓梯有 n 個臺階,每次可以走 1 個或 2 個臺階,請問走完這 n 個臺階有幾種走法

function climbStairs(n) {
  if (n == 1) return 1
  if (n == 2) return 2
  return climbStairs(n - 1) + climbStairs(n - 2)
}
複製程式碼

經典案例 4: 深拷貝

原理: clone(o) = new Object; 返回一個物件

function clone(o) {
  var temp = {}
  for (var key in o) {
    if (typeof o[key] == 'object') {
      temp[key] = clone(o[key])
    } else {
      temp[key] = o[key]
    }
  }
  return temp
}
複製程式碼

經典案例 5:遞迴元件

  • 遞迴元件: 元件在它的模板內可以遞迴的呼叫自己,只要給元件設定 name 元件就可以了。
  • 不過需要注意的是,必須給一個條件來限制數量,否則會丟擲錯誤: max stack size exceeded
  • 元件遞迴用來開發一些具體有未知層級關係的獨立元件。比如:聯級選擇器和樹形控制元件
<template>
  <div v-for="(item,index) in treeArr"> {{index}} <br/>
      <tree :item="item.arr" v-if="item.flag"></tree>
  </div>
</template>
<script>
export default {
  // 必須定義name,元件內部才能遞迴呼叫
  name: 'tree',
  data(){
    return {}
  },
  // 接收外部傳入的值
  props: {
     item: {
      type:Array,
      default: ()=>[]
    }
  }
}
</script>
複製程式碼

相關文章