0
私はプログラミングがとても新しく、私の良き友人は私に解決できるいくつかの「課題」を与えられています。私の配列の一部だけを取る関数を作成するには?
彼は最近、アルファベットの最初のN文字のすべての順列を書き込むプログラム(コンソールアプリケーション)を書くように頼んだ。だから、N = 3ならば、それは書きます:
ABC ACB BAC BCA CAB CBA私は再帰関数、配列やリストについて学んだ。これは私がこれまでのところ、私は学ぶ必要があるすべては、私はそれが唯一の最初のN文字を書き出すことができますどのように、stackoverflowのからここにいくつかの回答から、それを作ってしまったものです:
class Program
{
static void Main()
{
string[] items = { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
foreach (string[] permutation in Permutation.GetPermutations<string>(items))
{
Console.WriteLine(String.Join(", ", permutation));
}
Console.ReadKey();
}
}
public class Permutation
{
public static IEnumerable<T[]> GetPermutations<T>(T[] items)
{
int[] work = new int[items.Length];
for (int i = 0; i < work.Length; i++)
{
work[i] = i;
}
foreach (int[] index in GetIntPermutations(work, 0, work.Length))
{
T[] result = new T[index.Length];
for (int i = 0; i < index.Length; i++) result[i] = items[index[i]];
yield return result;
}
}
public static IEnumerable<int[]> GetIntPermutations(int[] index, int offset, int len)
{
if (len == 1)
{
yield return index;
}
else if (len == 2)
{
yield return index;
Swap(index, offset, offset + 1);
yield return index;
Swap(index, offset, offset + 1);
}
else
{
foreach (int[] result in GetIntPermutations(index, offset + 1, len - 1))
{
yield return result;
}
for (int i = 1; i < len; i++)
{
Swap(index, offset, offset + i);
foreach (int[] result in GetIntPermutations(index, offset + 1, len - 1))
{
yield return result;
}
Swap(index, offset, offset + i);
}
}
}
private static void Swap(int[] index, int offset1, int offset2)
{
int temp = index[offset1];
index[offset1] = index[offset2];
index[offset2] = temp;
}
}
(サブセットまたはスライスや配列の範囲と呼ばれている)古い配列から新しい配列を作成します。https://stackoverflow.com/questions/1792470/subset-of-array-in -c-sharp – Domi
'string [] validLetters = items.Take(n).ToArray();' – JLRishe
あなたの質問は本当に広すぎます。マークされた複製は、問題を解決するためのいくつかの可能な方法を示しています。あるいは 'N'の値を' GetPermutations() 'メソッドに渡し、' new int [items.Length] 'の代わりに' new int [n] 'として' work'を初期化するだけです。または他の方法でいくつでも使用できます。 –