C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

アルゴリズムを教えてください。

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■87239 / inTopicNo.1)  アルゴリズムを教えてください。
  
□投稿者/ 夜叉丸 (99回)-(2018/05/01(Tue) 10:28:50)

分類:[.NET 全般] 

strlst の配列数の分だけfor文を繰り返して結果を返したいのですが
どのようにすればよいのかわかりません。

private List<string> makestring(string[] s0, string[] s1)
{
 List<string> lst = new List<string>();
 for(int il0 = 0; il0 < s0.Length; il0++) {
  for(int il1 = 0; il1 < s1.Length; il1++) {
   lst.Add(s0[il0] + s1[il1]);
  }
 }
 return(lst);
}

private List<string> makestring(string[] s0, string[] s1, string[] s2)
{
 List<string> lst = new List<string>();
 for(int il0 = 0; il0 < s0.Length; il0++) {
  for(int il1 = 0; il1 < s1.Length; il1++) {
   for(int il2 = 0; il2 < s2.Length; il2++) {
    lst.Add(s0[il0] + s1[il1] + s2[il2]);
   }
  }
 }
 return(lst);
}

上記を1つにまとめて以下のような感じにしたいのですが
どうすればよいのでしょうか?


private List<string> makestring(prams List<string>[] strlst)
{
 List<string> lst = new List<string>();

 for(int il0 = 0; il0 < strlst[0].Count; il0++) {
  for(int il1 = 0; il1 < strlst[1].Count; il1++) {
		:
		:
   lst.Add(strlst[0] + strlst[1] + ・・・・);
		:
		:
  }
 }
 return(lst);
}

引用返信 編集キー/
■87242 / inTopicNo.2)  Re[1]: アルゴリズムを教えてください。
□投稿者/ 夜叉丸 (100回)-(2018/05/01(Tue) 10:51:59)
個数と最大数を引数にしたサブルーチンを作成して
そこからさらに同じサブルーチンを呼出し続けると
できそうな気がしてきました。

できなかったらまた、お伺いさせていただきます。
失礼しました。
解決済み
引用返信 編集キー/
■87244 / inTopicNo.3)  Re[2]: アルゴリズムを教えてください。
□投稿者/ PANG2 (6回)-(2018/05/01(Tue) 11:06:06)
ヒント
再帰関数

makestring(s0, s1, s2, s3)

makestring(makestring(s0, s1), s2, s3)

makestring((makestring(makestring(s0, s1), s2), s3)
引用返信 編集キー/
■87246 / inTopicNo.4)  Re[3]: アルゴリズムを教えてください。
□投稿者/ やよい (6回)-(2018/05/01(Tue) 13:42:04)
デカルト積

public static void Main() {
    var list = new List<List<string>> {
        new List<string>{"a", "b", "c"},
        new List<string>{"d", "e", "f"},
        new List<string>{"g", "h", "i"}
    };
    
    var products = GetProducts("", list);
    
    foreach (var product in products) {
        Console.WriteLine(product);
    }
}

static IEnumerable<string> GetProducts(string prefix, List<List<string>> list) {
    if (list.Count == 0) {
        yield return prefix;
        yield break;
    }
    foreach (var value in list[0]) {
        var products = GetProducts(prefix + value, list.GetRange(1, list.Count - 1));
        foreach (var product in products) {
            yield return product;
        }
    }
}

引用返信 編集キー/
■87247 / inTopicNo.5)  Re[1]: アルゴリズムを教えてください。
□投稿者/ 魔界の仮面弁士 (1655回)-(2018/05/01(Tue) 14:00:56)
2018/05/01(Tue) 15:30:05 編集(投稿者)

あぁ、質問の内容を読み違えてました。

引数として { "A", "B" } と {"X", "Y", "Z"} を渡した場合に
得たい結果は { "AX", "BY", "Z" } ではなく、
{ "AX", "AY", "AZ", "BX", "BY", "BZ" } なのですね。


以下は { "AX", "BY", "Z" } を得るための物なので読み捨ててください。



No87239 (夜叉丸 さん) に返信
> lst.Add(s0[il0] + s1[il1]);
これだと、
 "AB" + "C"
の場合と
 "A" + "BC"
の場合が区別できなくなりそうですが、それは構わないのですね?



> strlst の配列数の分だけfor文を繰り返して結果を返したいのですが
> どのようにすればよいのかわかりません。
> private List<string> makestring(string[] s0, string[] s1)
> {
件数が一致しない場合、すなわち s0.Length != s1.Length だった場合は、
どのような結果を返してほしいのでしょうか?



> private List<string> makestring(prams List<string>[] strlst)
prams というのは params のことだと思いますが、上記の場合の呼び出しは
 var result1 = makestring( new string[] { "A", "B" }, new string[] {"X", "Y"} );
ではなく、
 var result2 = makestring(new List<string>() { "A", "B" }, new List<string>() { "X", "Y" });
になりますが、それは構わないのでしょうか。

個人的には
 private List<string> makestring(params IEnumerable<string>[] strlst)
の方が良いのかな…とも思って書き換えてみました。
これなら上記 result1、result2 両方に対応できます。



private /* static */ List<string> makestring(params IEnumerable<string>[] strlst)
{
 int maxIndex = strlst.Max(p => p.Count());
 List<string> lst = new List<string>(Enumerable.Repeat("", maxIndex));
 foreach (var items in strlst)
 {
  int i = 0;
  foreach (var str in items)
  {
   lst[i++] += str;
  }
 }
 return lst;
}
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ