Toán học, 50 -> 47 -> 42 byte
p = Join[Range[2, #, 2], Range[1, #, 2]] &
Hãy thử trực tuyến!
Cảm ơn người dùng202729 vì đã chỉ ra tiềm năng tối ưu hóa gấp đôi Tham gia [] bắt nguồn từ Flatten [] và sử dụng các hàm thuần túy.
Tôi muốn thêm hai nhận xét.
1) Khá đơn giản để xây dựng một hoán vị cụ thể mà không có sự giảm hoặc tăng liên tiếp cho n> = 4 như yêu cầu n OP.
Nó bao gồm hai danh sách liên tiếp.
Đối với chẵn n, đây là:
list1 = (2,4, ..., n / 2)
list2 = (1,3, ..., n / 2-1)
Đối với n lẻ, chúng ta có:
list1 = (2,4, ..., Tầng [n / 2])
list2 = (1,3, ..., Tầng [n / 2])
Đối với "thuật toán" này, chỉ cần đưa ra một quyết định (n chẵn hoặc lẻ), phần còn lại chỉ là ghi n số.
Một giải pháp Mathicala có thể được cung cấp ở đầu.
2) Một câu hỏi liên quan là có bao nhiêu hoán vị như vậy tồn tại như một hàm của n.
Toán học, 124 byte
a[0] = a[1] = 1; a[2] = a[3] = 0;
a[n_] := a[n] = (n + 1)*a[n - 1] - (n - 2)*a[n - 2] - (n - 5)*a[n - 3] + (n - 3)*a[n - 4]
Hãy thử trực tuyến!
Thí dụ:
a[#] & /@ Range[4, 12]
{2, 14, 90, 646, 5242, 47622, 479306, 5296790, 63779034}
Để đếm số lượng hoán vị như vậy là một vấn đề tiêu chuẩn.
Với n = 4 có 2: {{2,4,1,3}, {3,1,4,2}}
Với n = 5 có 14: {{1,3,5,2,4}, {1,4,2,5,3}, {2,4,1,3,5}, {2,4, 1,5,3}, {2,5,3,1,4}, {3,1,4,2,5}, {3,1,5,2,4}, {3,5,1, 4.2}, {3,5,2,4,1}, {4,1,3,5,2}, {4,2,5,1,3}, {4,2,5,3, 1}, {5,2,4,1,3}, {5,3,1,4,2}}
Số a (n) của các hoán vị này tăng lên nhanh chóng: 2, 14, 90, 646, 5242, 47622, 479306, 5296790, 63779034, ...
Đối với n lớn tỷ lệ a (n) / n! dường như đạt đến giới hạn 1 / e ^ 2 = 0.135335 ... Tôi không có bằng chứng nghiêm ngặt nào nhưng đó chỉ là phỏng đoán từ bằng chứng số. Bạn có thể kiểm tra điều này bằng cách chạy chương trình trực tuyến.
Chương trình trên (dựa trên tài liệu tham khảo được đưa ra dưới đây) tính toán những con số này.
Bạn có thể tìm thêm thông tin trong chuỗi liên quan trên OEIS: A002464 . Vấn đề của Hertzsprung: cách sắp xếp n vị vua không tấn công trên một bảng n X n, với 1 trong mỗi hàng và cột. Ngoài ra số lượng hoán vị của chiều dài n mà không tăng hoặc giảm liên tiếp.