題目鏈接:https://leetcode-cn.com/problems/letter-combinations-of-a-phone-number/
總體思路:for循環(huán)內(nèi)部,字母自由組合嘛〗信郑可是特占,我要循環(huán)多少層呢雇锡?這要根據(jù)用戶的輸入的長(zhǎng)度決定揍拆,可是for循環(huán)的層數(shù)怎么動(dòng)態(tài)寫(xiě)哲虾?貌似不能芽淡。于是快速的瞄了一眼答案马绝。原來(lái)要用遞歸函數(shù)!U醴啤富稻!
使用遞歸函數(shù),判斷是否匹配到參數(shù)字符串(即下文的23)的盡頭白胀,是椭赋,則返回結(jié)果。不是或杠,則繼續(xù)搭配哪怔。
所以說(shuō)!當(dāng)我們遇到不具體的循環(huán)次數(shù)的時(shí)候,遞歸函數(shù)是一個(gè)很好的選擇认境。
以下是我的答案
const obj = {
2: ["a", "b", "c"],
3: ["d", "e", "f"],
4: ["g", "h", "i"],
5: ["j", "k", "l"],
6: ["m", "n", "o"],
7: ["p", "q", "r", "s"],
8: ["t", "u", "v"],
9: ["w", "x", "y", "z"],
}
var t=1
function digui(arr, str,res) {
let resArr = []
for (let i = 0; i < arr.length; i++){
for (let j = 0; j < obj[str].length; j++){
resArr.push(arr[i] + obj[str][j])
}
}
t++
arr = resArr
str = res[t]
if (str) {
digui(arr, str,res)
}
else {
console.log(arr)
return 0
}
}
function outer(x) {
let res = x.toString().split('')
let arr = obj[res[0]]//第一個(gè)數(shù)字
let str = res[t]
digui(arr, str, res)
}
outer(234)
本來(lái)是想用還順便用閉包和匿名函數(shù)的胚委。然而匿名函數(shù)要怎么遞歸?
其實(shí)這個(gè)之前也復(fù)習(xí)過(guò)了叉信。使用arguments
的callee
方法就可以實(shí)現(xiàn)匿名函數(shù)的遞歸
arguments.callee(參數(shù))
寫(xiě)到這里亩冬,又發(fā)現(xiàn)了一些坑。
第一個(gè)坑:如果這里沒(méi)有參數(shù)傳入硼身,直接寫(xiě)空括號(hào)的話硅急,是會(huì)報(bào)錯(cuò)的。畢竟
arguments
是管理參數(shù)的對(duì)象嘛佳遂。
那沒(méi)有參數(shù)要怎么寫(xiě)营袜?親親,這邊建議您讶迁,不要用閉包+匿名函數(shù)+遞歸了哦连茧。可以像我上面那樣巍糯,拆開(kāi)寫(xiě)啸驯。第二個(gè)坑:在使用閉包,閉包作用域固然使它可以訪問(wèn)到閉包外部的變量祟峦,但是當(dāng)遇到這種情況時(shí)罚斗,
function outer() {
let res = 23
return function(res){
console.log(res) //undefined
}
知道了吧,閉包里面的res
首先應(yīng)當(dāng)是傳入的參數(shù)的res
宅楞,然后才是閉包外面的res
第三個(gè)坑:使用一個(gè)對(duì)象裝載數(shù)字與字母的對(duì)應(yīng)信息不知道性能上怎么樣针姿?發(fā)現(xiàn)大佬都是用
map
的,所以又給自己留下個(gè)坑厌衙,會(huì)去看的距淫。畢竟秋招嘛,狹路相逢婶希,總會(huì)遇到這個(gè)知識(shí)點(diǎn)的榕暇。寫(xiě)在最后,leetcode的編輯器老是報(bào)錯(cuò)喻杈,說(shuō)找不到
arr.length
彤枢。搞到我提交不了代碼,真的是筒饰。會(huì)不會(huì)跟瀏覽器的什么嚴(yán)格模式有關(guān)缴啡。有空也要把這坑填了。