あなたは私たちが再び起動し、そう のは、あなたのコードを見てみましょうよりも、あなたのコードを修正することを好むように見えます。まず、メインリストチョッピング:
reverse (take i (reverse xs)) ++ reverse (drop i (reverse xs))
今reverse (take i (reverse xs))
は、リストの末尾からi
要素を取る いますが、これを達成するために二度リストを逆にし、 drop (length xs - i) xs
を行う方が良いでしょう。同様に、reverse (drop i (reverse xs)))
をtake (length xs - i) xs
として実装できます。それは、それが動作することはできませんn
、とリスト[1..n]
を比較するため、今すぐあなたのコード\i->[1..n]<=n
は意味がありません。私たちに
drop (length xs - i) xs ++ take (length xs - i) xs
を与えます。 i
が 1
からn
まで実行されるループを作成しようとしていると思います。これは良い計画です。我々は望んでいたものを取得するには、リストの内包表記を使用してみましょう:
[drop (length xs - i) xs ++ take (length xs - i) xs | i <- [1 .. length xs], i <= n]
が、今、私たちはより良い
[drop (length xs - i) xs ++ take (length xs - i) xs | i <- [1..n]]
を書かされるであろう1からリストの長さに実行されているが、
n
上の数字を捨て、 ています
これにより、n
はlength xs
以上になりますが、そこに大きな問題はありません。最初に確認できました。
お知らせ今、我々は唯一の形(length xs - i)
でi
を使用している、と本当に我々は我々がすべきなので、代わりに1
からn
にi
実行をさせると、 length xs - i
を使用するよりも length xs
非常に多くの詳細を再計算していること、
ため例えば
[6,5..1] == [6,5,4,3,2,1]
作品
[drop j xs ++ take j xs | j <- [length xs,length xs - 1 .. length xs - n]]
:私たちはちょうどlength xs
length xs - n
からj=length xs -i
のでj
の実行を持っていない理由
あなたが算術演算をしたいより多くのtake
たい
let l = length xs in
[drop j xs ++ take j xs | j <- [l,l - 1 .. l - n]]
または多分あなたを行うには滑らかな印象になりますので、私たちは使用することができます
あなたを停止する追加の利点を持っている
let l = length xs in
take n [drop j xs ++ take j xs | j <- [l,l - 1 .. 0]]
あまりにも多くをして、あなたが最初に戻るときにあなたを あなたが停止する。
私はrotationsR 6 [1..4] == [[1,2,3,4],[4,1,2,3],[3,4,1,2],[2,3,4,1],[1,2,3,4]]
を与える
rotationsR n xs = let l = length xs in
take n [drop j xs ++ take j xs | j <- [l,l - 1 ..]]
を与え、generatingListforRightShifting
からrotationsR
にあなたの関数の名前を変更したいです。
左回転が簡単になります。
rotationsL n xs = take n [drop j xs ++ take j xs | j <- [0..length xs]]
余談:私は申し訳ありませんが、自分自身を助けることができなかった、と私は再び始まりました。
私はまだすべてがドロップを好きではないし、一つ一つの時間を取って、私はむしろ隣同士(cycle xs
)へxs
の 無限に多くのコピーを開くとにそれらすべてをチョッピング無限というの 多くtails
を取ると思います最初のnを与えてください:
ローテーションL 'n xs = l =長さxsを で取る。マップ(take l)。尾。そのため、遅延評価のサイクルの$ XS
、cycle xs
の唯一の有限量がこれまでに計算されます、 が、この1つは実行し、実行することができます:rotationsL' 10 [1..4]
はあなたを与える:
[[1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3],[1,2,3,4],[2,3,4,1],[3,4,1,2],[4,1,2,3],[1,2,3,4],[2,3,4,1]]
権利を行うにはいいだろうあまりにも多くのローテーションがありますが、それはうまくいきません。 私は無限のリストの終わりに始まり、帰り道に戻る必要があります。
rotationsR' n xs = let l = length xs in
take n . map (reverse.take l) . tails . cycle . reverse $ xs
Undigressionを:しかし、再びトリックを逆に、あなたが必要なものを取る、のは、 あなたの逆を再利用してみましょうあなたは、むしろ自分の元のコードに、より密接に固執したい場合は、
generatingListforRightShifting n xs =
[reverse (take i (reverse xs)) ++ reverse (drop i (reverse xs)) | i <- [1..n]]
を行うことができます
'drop'であろうと、無「シフト」は「回転」を意味する。 –
@ダニエルフィッシャー:うん - 私はあまりにも遅く、質問を半分読んだことを知った。 「回転」はいい名前です。 – xtofl
thnx to u xtolf。実際に初心者として、私は頭、尾、繰り返しのような単純な操作を使用しようとします。このため、私はこの問題を試しています。私はコードを大幅に変更したくない。 "逆方向(逆方向xs)++反転(逆方向i(逆方向xs))")は単一の時間シフトのために働く。私は複数の時間シフトのためにこれを使いたい。あなたは私を助けてくれますか? btw、thxと非常に非常にthnx fr ur effrt – sabu