Mathematica、50-> 47-> 42バイト
p = Join[Range[2, #, 2], Range[1, #, 2]] &
オンラインでお試しください!
Flatten []の代わりに使用される2つの最適化の潜在的なJoin []を指摘し、純粋な関数を使用してくれたuser202729に感謝します。
2つの発言を追加したいと思います。
1)OPで要求されたn> = 4で、連続した下降または上昇のない特定の順列を構築するのはかなり簡単です。
2つの連続したリストで構成されます。
偶数nの場合:
list1 =(2,4、...、n / 2)
list2 =(1,3、...、n / 2-1)
奇数nの場合:
list1 =(2,4、...、Floor [n / 2])
list2 =(1,3、...、Floor [n / 2])
この「アルゴリズム」については、1つの決定(n偶数または奇数)を行う必要があり、残りはn個の数字を書き留めるだけです。
可能なMathematicaソリューションが上部に提供されています。
2)関連する質問は、nの関数としてそのようなパーミュレーションがいくつ存在するかです。
Mathematica、124バイト
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]
オンラインでお試しください!
例:
a[#] & /@ Range[4, 12]
{2、14、90、646、5242、47622、479306、5296790、63779034}
そのような順列の数を数えることは標準的な問題です。
n = 4の場合、2は{{2,4,1,3}、{3,1,4,2}}です。
n = 5の場合、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}}
これらの順列の数a(n)は急速に増加します:2、14、90、646、5242、47622、479306、5296790、63779034、...
nが大きい場合、比率a(n)/ n!限界1 / e ^ 2 = 0.135335に近づいているようです。厳密な証拠はありませんが、数値的証拠からの推測にすぎません。オンラインでプログラムを実行して、これをテストできます。
上記のプログラム(下記の参照に基づいて)は、これらの数値を計算します。
OEIS:A002464の関連するシーケンスで詳細を確認できます。Hertzsprungの問題:n X nボード上にn個の非攻撃キングを配置する方法。各行と列に1つずつ。また、連続した上昇または下降を伴わない長さnの順列の数。