var make = function(n) {
if (n === 0) return ['0']
if (n === 1) {
return ['0', '1']
} else {
let prev = make(n - 1)
let max = Math.pow(2, n) - 1
let result = new Array(max)
for (let i = 0; i < prev.length; i++) {
result[i] = `0${prev[i]}`
result[max-i] = `1${prev[i]}`
}
return result
}
};
var grayCode = function(n) {
let binaryArr = make(n)
return binaryArr.map(item => {
return parseInt(item, 2)
})
};
複制
題目解析:
比如輸入2,代表輸出((兩位))的二進制(格雷編碼)所對應的十進制。注意,必須是以0開頭的哈。0完了才是1的開始哈。
然後下面是找·規律。記住堆成的輸出。
找規律:

輸入1的時候,代表2的1次方。
輸入2的時候,代表2的二次方。
輸入3的時候,代表2的三次方。
而這些次方分成了兩份,一份是0,一份是1.
0完了才是1的開始。
記住,n以n-1為基礎的,3以2為基礎,對稱的,比如2的是00 01 11 10,00是3的第一個和最後一個,并且第一個前面加上0,後面是00.最後一個前面加上1.後面是00.以此類推。然後第二個是001,最後的第二個是101。。。。。。。。
let prev = make(n - 1)
複制
要想知道n得知道n-1.
let max = Math.pow(2, n) - 1
複制
看一看n多少次把,為什麼-1.,因為從0開始的啊,數組。
for (let i = 0; i < prev.length; i++) {
result[i] = `0${prev[i]}`
result[max-i] = `1${prev[i]}`
}
複制
第一位與最後,第二位與最後第二位。第三位與最後的第三位,第四位與最後的第四位。。。。
遞歸的哈。
var grayCode = function(n) {
let binaryArr = make(n)//遞歸
return binaryArr.map(item => {
return parseInt(item, 2)//然後存到map裡面。把二進制item轉換成十進制
})
};
複制