PDA

View Full Version : سوال: اصلاح کد : ایجاد کلمات به صورت صعودی ؟



Mosafers
چهارشنبه 30 مهر 1393, 16:04 عصر
سلام اساتید محترم یه سوال و کمک در تغییر روال کد داشتم.

یه کد باشه که اینطور کلماتی بسازه ؟

a
b
c
d
تا
z
... ادامه :
aa
ab
ac
تا
az
...دوباره:
aaa
aab
aac
aad
و غیره...

من با کد زیر کلمات رو ساختم ولی محدود بود :

private void button2_Click(object sender, EventArgs e)
{
foreach (var result in GetPermutations("abcdefghijklmnopqrstuvwxyz", 3))
{
MessageBox.Show (result );
}
}


public static IEnumerable<string> GetPermutations(string letters, int max = 3, int curr = 0)
{
if (curr < max - 1)
{
for (int a = 0; a < letters.Length; a++)
{
string firstHalf = letters.Substring(a, 1);
string subset = letters.Substring(a + 1);
foreach (string secondHalf in GetPermutations(subset, max, curr + 1))
{
//Console.Write("1st: {0}, 2nd: {1}; set: {2}", firstHalf, secondHalf, subset);
yield return firstHalf + secondHalf;
}
}
}
else
yield return String.Empty;
}


با تشکر و سپاس

elec60
پنج شنبه 01 آبان 1393, 00:17 صبح
با این کد جنریک میتونی تمام ترکیبات با طول دلخواه رو بدست بیاری و با Linq مرتبش کنی:




static IEnumerable<IEnumerable<T>>
GetPermutations<T>(IEnumerable<T> list, int length)
{
if (length == 1) return list.Select(t => new T[] { t });


return GetPermutations(list, length - 1)
.SelectMany(t => list.Where(e => !t.Contains(e)),
(t1, t2) => t1.Concat(new T[] { t2 }));
}

elec60
پنج شنبه 01 آبان 1393, 00:21 صبح
برای مثال اعداد ۱ تا ۳ رو در نظر بگیر:



IEnumerable<IEnumerable<int>> result =
GetPermutations(Enumerable.Range(1, 3), 3);

Mosafers
پنج شنبه 01 آبان 1393, 01:15 صبح
سلام ممنونم از لطف شما ولی این کد کدی نیست که من میخوام لطفا اگه امکانش هست کد خودم رو یه بررسی کوچیک کنید ...

rahnema1
پنج شنبه 01 آبان 1393, 02:41 صبح
این جور میشه نوشت

int n;
char [] perm;
List <string> result = new List<string>();
void GetPermutations1(int i, char harf)
{
if (i == n)
{
result.Add(string.Concat(perm));
return;
}
for (char alefba = harf; alefba <= 'z'; alefba++)
{
perm[i] = alefba;
GetPermutations1(i + 1, alefba);
}
}
void Button3Click(object sender, EventArgs e)
{
n = 3;
perm = new char[n];
GetPermutations1(0, 'a');
richTextBox1.Text = string.Join("\n", result);
}