遞迴的概念
就是函式自己呼叫自己本身,或者在自己函式呼叫的下級函式中呼叫自己。
遞迴的步驟
- 假設遞迴函式已經寫好
- 尋找遞推關係
- 將遞推關係的結構轉換為遞迴體
- 將臨界條件加入到遞迴體中
經典案例 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>
複製程式碼