Mô tả vấn đề
Chúng ta cần viết hàm JavaScript nhận vào số n. Hàm trả về mảng các số 1..n sắp xếp sao cho tổng của mỗi 2 số liên tiếp là số chính phương.
Ví dụ minh họa
Mã thực hiện (backtracking):
const n = 15;
const buildSquaresArray = (n = 1, res = []) => {
const helper = (res, set, n) => {
if(set.size === n){ return true; };
for(let i = 1; i <= n; i++){
if (set.has(i)){ continue; };
if(res.length && Math.sqrt(res[0] + i) % 1 !== 0){ continue; };
set.add(i);
res.unshift(i);
if(helper(res, set, n)){ return true; }
res.shift();
set.delete(i);
};
return false;
};
return helper(res, new Set(), n) ? res : false;
};
console.log(buildSquaresArray(n));Đầu ra
Kết quả trong console:
[ 9, 7, 2, 14, 11, 5, 4, 12, 13, 3, 6, 10, 15, 1, 8 ]