私はこのようなシーケンスを生成する必要があります
[1, 3, 5, 7, 9, 13, 17, 21, 25, 31, 37, 43, 49, 57, 65, 73, 81]
エリクサーのこのシーケンスジェネレーターについてどう思いますか?
(この例では17数)
アルゴリズムである:
[1, (previous + 2), (previous + 2), (previous + 2), (previous + 2), (previous + 4), (previous + 4), (previous + 4), (previous + 4) ...
だから、その後、4つの最初のアイテムの+2です次の4の場合は+4、次の場合は+6、4の場合は2ずつ増加します。
私はRubyで迅速かつハックバージョンを行うことができました:def sequence
incr = 0
(0..16).each.inject([]) do |acc, counter|
acc << (acc.last || 1) + incr
incr += 2 if counter.modulo(4) == 0
acc
end
end
しかし、私はエリクサーで同じことをやって問題を抱えています - それは、超ラメが判明します。このように:もちろん、私は命令的に、ここで考えてはいけませんが、私はできません。この問題のために
def sequence do
{ sequence, _ } =
0..16
|> Enum.reduce({[], 0}, fn(counter, {result, incr}) ->
last = List.last(result)
if last do
result = result ++ [last + incr]
else
result = [1]
end
if rem(counter, 4) == 0 do
incr = incr + 2
end
{result, incr}
end)
sequence
end
:D 私もパイプがはるかに原子的なアプローチがあると確信しています。
この問題はエリクシールの方法でどのように解決できますか?
おかげさまでヒープ! ':lists.reverse'を' Enum.reverse'に使う利点もありますか? – konnigun
実際はありません。 ':lists.reverse'は、' Enum.reverse'が最初に型チェックを行い、リストを見つけたら ':lists.reverse'に委譲するので、少し早いかもしれません。パフォーマンスの差は重要ではありません。私は 'Enum.reverse'に変更します。 – Dogbert