2017-11-05 3 views
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; 
     } 


    } 
+2

(サブセットまたはスライスや配列の範囲と呼ばれている)古い配列から新しい配列を作成します。https://stackoverflow.com/questions/1792470/subset-of-array-in -c-sharp – Domi

+1

'string [] validLetters = items.Take(n).ToArray();' – JLRishe

+0

あなたの質問は本当に広すぎます。マークされた複製は、問題を解決するためのいくつかの可能な方法を示しています。あるいは 'N'の値を' GetPermutations () 'メソッドに渡し、' new int [items.Length] 'の代わりに' new int [n] 'として' work'を初期化するだけです。または他の方法でいくつでも使用できます。 –

答えて

0

どれだけ設定するNを変更しますたくさんの手紙をあなたに含めること。あなたはまたランダムにすることができますので、常に最初のN文字を取得することはありません。

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     int N = 5; 
     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" }; 
     var take = items.Take(N); 
     string str = ""; 
     foreach(string s in take) 
     { 
      str += s; 
     } 
     char[] charArry = str.ToCharArray(); 
     permute(charArry, 0, str.Length-1); 
    } 

    static void permute(char[] arry, int i, int n) 
    { 
     int j; 
     if (i==n) 
      Console.WriteLine(arry); 
     else 
     { 
      for(j = i; j <=n; j++) 
      { 
       swap(ref arry[i],ref arry[j]); 
       permute(arry,i+1,n); 
       swap(ref arry[i], ref arry[j]); 
      } 
     } 
    } 

    static void swap(ref char a, ref char b) 
    { 
     char tmp; 
     tmp = a; 
     a=b; 
     b = tmp; 
    } 
} 
関連する問題