2016-11-22 4 views
-1

C#でIEnumerableの置換(繰り返し)関数を作成しようとしています。 私はすでに配列を使っている関数を持っています。整数を基にしたIEnumerableを使った繰り返しの置換

public IEnumerable<IEnumerable<T>> GetPermsWithReps<T>(IEnumerable<T> items, int count) 
{   
    foreach (var item in items) 
    { 
     if (count == 1) 
     { 
      yield return new T[] { item }; 
     } 
     else 
     { 
      foreach (var result in GetPermsWithReps(items, count - 1)) 
      { 
       yield return new T[] { item }.Concat(result); 
      } 
     } 
    } 
} 

そして、それはかなりうまく動作します...しかし は、今私はストレートの整数ではなく、アレイ上で動作しますIEnumerableを機能させる必要があります。だから私はそれを好きなように呼んでいます。

GetPermsInts(max_val = 1, digits_num = 2) 

出力する必要があります。

00 
01 
10 
11 

私はそれを達成するために多くの方法でその機能を変更しようとしませんが、まだ運... は、誰かが私を助けることができるしてください?

+1

したがって、値が与えられたときに、ゼロとその数値の間のすべての可能な値のシーケンスを作成する方法を理解する必要があります。既存のLINQメソッドを見て、これを行うメソッドがあるかどうかを調べることができます(ヒント:*正確に*これを行うメソッドがあります)。それは非常に複雑な関数ではありません。 – Servy

+0

@Servy実際には、すべての可能な値をダンプする関数を書くことはできますが、問題は全部欲しくないということです。これらのレコードのうちの3つが条件を満たすと、私はIEnumerableを使用しています(各サイクルの後にレコードをチェックすることができるからです)。そして、配列をベースパラメータとしてもう使用したくありません。なぜなら、配列に可能なすべての数字を最初にダンプする必要があるからです。時間と記憶の浪費)。あなたはなにか考えはありますか ? – LOLOLOLO

+0

それ自身でシーケンスのすべての置換を含むシーケンスを作成しようとしているときに、その中に '0'と' 1'を含むシーケンスを作成すると、コストがかかりません。あなたは 'n! '複雑さで操作を実行しています。サイズ「n」の入力シーケンスを作成することは決して重要ではない。 – Servy

答えて

0

さて、あなたは(あなたが文字列を返すようにしたいと仮定した場合)そのような何かを行うことができます。

IEnumerable<string> EnumeratePermutations(int digits, int length) 
{ 
    var data = new char[length]; 
    for (int i = 0; i < data.Length; ++i) 
    { 
     data[i] = '0'; 
    } 

    while (true) 
    { 
     yield return new string(data); 

     char maxChar = (char)('0' + digits); 

     for (int index = length - 1; index >= 0; --index) 
     { 
      if (++data[index] == maxChar) 
      { 
       for (int i = index; i < data.Length; ++i) 
       { 
        data[i] = '0'; 
       } 

       if (index == 0) 
       { 
        yield break; 
       } 
      } 
      else 
      { 
       break; 
      } 
     } 
    } 
} 

あなたはdigits明確な文字を使用して、指定されたlengthの任意の順列を得ることができますこの方法。ベースが9より大きい場合は、目的の文字を使用するためのマッピングを追加する必要があります。

このコードは、使用された順列を字句順でのみ生成します。

+0

ところで、そのコードでは、私のコンピュータ上で 'EnumeratePermutations(222、5).Skip(35000000).Take(5)'を約1秒で実行できます。したがって、私は質問の下のコメントに与えられたパラメータで何もしないと、1秒あたり約3500万の値を繰り返します。 – Phil1970

関連する問題