Vấn đề
Trong toán học, dãy look-and-say là dãy số nguyên bắt đầu như sau:
1, 11, 21, 1211, 111221, 312211, …
Để tạo một thành viên của dãy từ thành viên trước, chúng ta đọc các chữ số của thành viên trước, đếm số chữ số trong các nhóm cùng chữ số.
Ví dụ, số tiếp theo của 1211 là:
111221
Vì nếu chúng ta đọc chữ số của 1211 to sẽ là:
Một 1, một 2, hai 1 cho ta 111221
Chúng ta cần viết một hàm JavaScript nhận vào một số n và trả về n số hạng đầu của dãy look-and-say.
Ví dụ
Dưới đây là mã:
const num = 12;
const generateSequence = (num = 1) => {
const lookAndSay = (val) => {
let res = '';
let chars = (val + ' ').split('');
let last = chars[0];
let count = 0;
chars.forEach(c => {
if(c === last){
count++;
}else{
res += (count + '') + last;
last = c;
count = 1;
};
});
return res;
}
let start = 1;
const res = [];
for(let i = 0; i < num; i++){
res.push(String(start));
start = lookAndSay(start);
};
return res;
};
console.log(generateSequence(num));
Kết quả
Kết quả console:
[ '1', '11', '21', '1211', '111221', '312211', '13112221', '1113213211', '31131211131221', '13211311123113112211', '11131221133112132113212221', '3113112221232112111312211312113211' ]