我已經瀏覽了堆棧溢出,但一直未能得到任何工作。我很抱歉,如果我錯過了一個明顯的明顯的職位。試圖通過遞歸更優雅地解決電話單
我有一個學校的問題,涉及到一個電話號碼,獲取所有可能的單詞組合,然後將其寫入文本文件。我做到了,爲我的任務得到了充分的信任。我能夠用七個嵌套循環做到這一點,但這不是很優雅,而且非常僵硬。我被吹走了,完全失望地發現教科書解決方案有七個嵌套循環。我的老師也沒有任何答案。
我已經嘗試了許多不同的方法,但我一直無法獲得它撥入英寸我確定了一個遞歸和殺戮點,但從來沒有能夠得到它的工作。我可以產生這些字母序列,但不知道應該有多少。我評論了我的嘗試,所以你可以看到我的失敗思維過程:)請看看,讓我知道你是否有任何想法。
public partial class TelephoneWorderizer : Form
{
protected Dictionary<int, IEnumerable<string>> KeyMappings = new Dictionary<int, IEnumerable<string>>();
protected string[][] ActiveLettersGroups = null;
protected List<string> Words = new List<string>();
protected List<string> RecursiveWords = new List<string>();
protected int Iteration = 0;
public TelephoneWorderizer()
{
InitializeComponent();
this.KeyMappings = this.GetKeyMappings();
}
private void btnGetWords_Click(object sender, EventArgs e)
{
string textBoxContent = textBoxNumber.Text;
int[] digits = this.GetPhoneNumbers(textBoxContent);
List<string> words = this.GetWords(digits);
using (StreamWriter writer = new StreamWriter(@"E:\words.txt"))
{
foreach (var word in words)
{
writer.WriteLine(word);
}
}
textBoxNumber.Clear();
}
private List<string> GetWords(int[] digits)
{
List<string[]> letterGroupings = new List<string[]>();
//digits array of numbers
for (int i = 0, j = digits.Length; i < j; i++)
{
int digit = digits[i];
//if the number has a letter group mapped to it
if (this.KeyMappings.ContainsKey(digit))
{
// letters mapped to a given number
letterGroupings.Add(this.KeyMappings[digit].ToArray());
}
}
this.WordMakerLoop(letterGroupings);
//this.WordMaker(letterGroupings);
return this.Words;
//return this.RecursiveWords;
}
//private void RecursionTest(string word, List<string[]> groups, int letterCtr, int groupCtr)
//{
// string[] Group = groups[groupCtr];
// word += Group[letterCtr];
// letterCtr += 1;
// if (letterCtr < Group.Length - 1)
// {
// letterCtr = 0;
// groupCtr += 1;
// // Hit bottom
// if (groupCtr == groups.Count - 1)
// {
// groupCtr -= 1;
// }
// RecursionTest(word, groups, letterCtr, groupCtr);
// }
//}
private void WordMaker(List<string[]> letterCollections)
{
string newword = "";
int numberLength = letterCollections.Count;
this.ActiveLettersGroups = letterCollections.ToArray();
string[] letterGroup = this.ActiveLettersGroups[0];
this.RecursiveGetWords(newword, 0, 0);
}
/// <summary>
///
/// </summary>
/// <param name="word"></param>
/// <param name="groupIndex"></param>
/// <param name="letterIndex"></param>
private void RecursiveGetWords(string word, int groupIndex, int letterIndex)
{
/*
*
*
*
*/
var numActiveLetterGroups = this.ActiveLettersGroups.Length;
if (this.ActiveLettersGroups.Length > 0 && this.Iteration < numActiveLetterGroups)
{
if (groupIndex < numActiveLetterGroups)
{
var letters = this.ActiveLettersGroups[groupIndex]; // Picks the a letter group ex: A, B, C
if (letterIndex < letters.Length)
{
//var letter1 = letters.Select(x =>
string letter = letters[letterIndex]; // Picks a letter from the group ex: A
word += letter;
this.RecursiveGetWords(word, groupIndex + 1, this.Iteration);
}
else
{
//this.RecursiveWords.Add(word);
//word = "";
//this.RecursiveGetWords(word, 0, 1);
}
}
else
{
this.RecursiveWords.Add(word);
word = "";
this.Iteration++;
this.RecursiveGetWords(word, 0, this.Iteration);
}
}
}
#region
private void WordMakerLoop(List<string[]> letterGroups)
{
string word = "";
// array of string[]
var newGroup = letterGroups.ToArray();
//grabs a letter group
for (int i = 0; i < newGroup.Length; i++)
{
var letterGroup1 = newGroup[i];
//grabs a letter from group 1
for (int j = 0; j < letterGroup1.Length; j++)
{
string letter1 = letterGroup1[j];
if (i + 1 < newGroup.Length)
{
var letterGroup2 = newGroup[i + 1];
//grabs a letter from group 2
for (int k = 0; k < letterGroup2.Length; k++)
{
string letter2 = letterGroup2[k];
if (i + 2 < newGroup.Length)
{
var letterGroup3 = newGroup[i + 2];
//grabs a letter from group 3
for (int l = 0; l < letterGroup3.Length; l++)
{
string letter3 = letterGroup3[l];
if (i + 3 < newGroup.Length)
{
var letterGroup4 = newGroup[i + 3];
//grabs a letter from group 4
for (int m = 0; m < letterGroup4.Length; m++)
{
string letter4 = letterGroup4[m];
if (i + 4 < newGroup.Length)
{
var letterGroup5 = newGroup[i + 4];
//grabs a letter from group 5
for (int n = 0; n < letterGroup5.Length; n++)
{
string letter5 = letterGroup5[n];
if (i + 5 < newGroup.Length)
{
var letterGroup6 = newGroup[i + 5];
//grabs a letter from group 6
for (int o = 0; o < letterGroup6.Length; o++)
{
string letter6 = letterGroup6[o];
if (i + 6 < newGroup.Length)
{
var letterGroup7 = newGroup[i + 6];
//grabs a letter from group 6
for (int p = 0; p < letterGroup7.Length; p++)
{
string letter7 = letterGroup7[p];
word = letter1 + letter2 + letter3 + letter4 + letter5 + letter6 + letter7;
this.Words.Add(word);
word = "";
}
}
}
}
}
}
}
}
}
}
}
}
}
}
}
// Sanitizes input text and converts the string into and arra of int
private int[] GetPhoneNumbers(string content)
{
int[] phoneNumbers = null;
string cleanString = this.SanitizeString(content);
int numbers;
if (Int32.TryParse(cleanString, out numbers))
{
//phoneNumbers = this.GetIntArray(numbers).OfType<int>().ToList();
phoneNumbers = this.GetIntArray(numbers);
}
return phoneNumbers;
}
// Removes potential unwanted characters from the phone number
private string SanitizeString(string content)
{
content = content.Replace("-", "");
content = content.Replace("(", "");
content = content.Replace(")", "");
return content;
}
//breaks a number into an array of its individual digits
private int[] GetIntArray(int num)
{
List<int> listOfInts = new List<int>();
while (num > 0)
{
listOfInts.Add(num % 10);
num = num/10;
}
listOfInts.Reverse();
return listOfInts.ToArray();
}
//gets the mappings for the numerical values
private Dictionary<int, IEnumerable<string>> GetKeyMappings()
{
List<string> alphabet = new List<string>() { "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" };
Dictionary<int, IEnumerable<string>> mappings = new Dictionary<int, IEnumerable<string>>();
for (int i = 0; i < 10; i++)
{
string[] letters = null;
switch (i)
{
case 0:
case 1:
break;
case 2:
case 3:
case 4:
case 5:
case 6:
case 8:
letters = alphabet.Take(3).ToArray();
mappings.Add(i, letters);
alphabet.RemoveRange(0, 3);
break;
case 7:
case 9:
letters = alphabet.Take(4).ToArray();
mappings.Add(i, letters);
alphabet.RemoveRange(0, 4);
break;
default:
break;
}
}
return mappings;
}
#endregion
}
讓我強調,對於那些疑惑的人來說,學校的任務已經結束。我想更好,更高效地做到這一點。如果這有幫助,我可以在gitHub上發佈我的項目。
聽起來像是一件非常適合[codegolf.se]的東西 – ThiefMaster
真棒問題,很高興看到問題,清楚地表明您的邏輯,以及您以代碼形式自己解決問題的努力。往往有評論要求提供更多的信息,或者要求提問的人做出努力,這是非常棒的。 +1。 – Crippledsmurf