リストを回転させる機能があります:
rotate :: [a] -> [a]
rotate [] = []
rotate (x:xs) = xs ++ [x]
ここで、有限リストの可能なすべてのローテーションでリストを提供する関数が必要です。
rotateAll :: [a] -> [[a]]
命令型言語では、(疑似コードで)次のようにします
for i = 1 to length of list
append list to rotateList
list = rotate(list)
もちろん、命令的に考えても、この問題の機能的な解決策を見つけるのにはおそらく役立ちません。これに対処する方法についてのヒントを探しています。
追加の考え:
これを解決するには、2 つの問題に取り組む必要があります。最初に、リストを繰り返しローテーションし、各結果をリストに収集する必要があります。したがって、最初の解決策は次のようなことをする必要があります
rotateAll xs = [xs (rotate xs) (rotate (rotate xs)) (rotate (rotate (rotate xs))) ...]
もちろん、これを何回行うかはわかりません。take (length xs)
これを無限に実行してから、必要な有限数のリストを取得するために使用することに満足します。これは実際に 2 番目の問題、つまりいつ停止するかを決定することを示しています。take
を使用することが問題を解決するための最も効率的またはエレガントな方法であるかどうかはわかりませんが、これを入力しているときに頭に浮かび、動作するはずです。
補遺: 2 つの解決策を自分で、またはヒントで見つけました。より高速な、または異なるアプローチを使用する他のソリューションを喜んで歓迎します。ありがとう!