Логическая функция .NET C #, рекуррентная функция

#c# #algorithm #function #logic

#c# #алгоритм #функция #Логические

Вопрос:

У меня есть некоторая строка в таком формате

XXXX-XXXX-X_X_

Все «_» следует заменить буквами и цифрами, чтобы выполнить что-то подобное:

 XXXX-XXXX-XAXA
XXXX-XXXX-XAXB
XXXX-XXXX-XAXC
XXXX-XXXX-XAXD
XXXX-XXXX-XAXE
XXXX-XXXX-XAXF
XXXX-XXXX-XAXG
(...)
XXXX-XXXX-XZX8
XXXX-XXXX-XZX9
XXXX-XXXX-X0XA
(...)
XXXX-XXXX-X2XA
XXXX-XXXX-X2XB
  

Я знаю, как сделать это с помощью одного «_».

                 string alphaLetters = "ABCDEFGHIJKLMNOPQRSTUWXYZ0123456789ABCDEF";
                foreach (char letter in alphaLetters.ToCharArray())
                {
                    Numbers.Add(number.Replace('_', letter)));                     
                }
  

Я хочу, чтобы этот код работал с неизвестным числом «_».

Вы можете помочь?

Комментарии:

1. @Dyppl — это коллекция сгенерированных строк.

2. @Hooch: Я пишу другое решение для решения вашей проблемы, как я ее вижу

3. Будет ли число os _ одинаковым для всех чисел в коллекции Numbers?

4. @Dyppl Ты не понимаешь. Numbers — это коллекция, которая содержит все сгенерированные коды. Существует только в коде с символами «_». Это тот, который используется в качестве шаблона.

5. Вам нужны все возможные комбинации? Например, если буквенные обозначения имеют длину 42 и у вас есть два _ заполнителя, вы хотите 42 * 42 = 1764 комбинации?

Ответ №1:

ИМХО это должно быть рекурсивно. (Примечание: это не означает, что он должен использовать рекурсивный вызов метода, хотя я использовал рекурсивный вызов в следующем коде, его можно легко преобразовать во внутренний стек рекурсии. )

 public static void RunSnippet()
{
    var r = new List<string>();
    Replace("asd_asd_asd_".ToCharArray(), 0, r);
    foreach(var s in r) { Console.WriteLine(s); }
}

public static char[] possibilities = new char[] { 'A', 'B', 'C' };

public static void Replace(char[] chars, int startIndex, IList<string> result)
{       
    for (int i = startIndex; i < chars.Length; i  )
    {
        if (chars[i] != '_')
        {
            continue;
        }

        // we found first '_'
        for (int j = 0; j < possibilities.Length; j  )
        {
            chars[i] = possibilities[j];
            Replace(chars, i   1, result);              
        }

        chars[i] = '_'; // take back what we replaced
        return; //we're done here
    }

    // we didn't find any '_', so all were replaced and we have result:
    result.Add(new string(chars));
}
  

Ответ №2:

Попробуйте этот:

 var alphaIndexes = new List<int>();
string alphaLetters = "ABCDEFGHIJKLMNOPQRSTUWXYZ0123456789ABCDEF";

for(int n = 0; n<Numbers.Count; n  ) {
    char[] numberLetters = Numbers[n].ToCharArray();

    int position = 0;

    for(int i = numberLetters.Length - 1; i>=0; i--) {  
        if(numberLetters[i] == '_') {
            int alphaIndex = 0;
            if(alphaIndexes.Count <= position)
                alphaIndexes.Add(0);
            else {
                alphaIndex = alphaIndexes[position];
            }

            numberLetters[i] = alphaLetters[alphaIndex];
            position  ;         
        }
    }

    if(alphaIndexes.Count > 0) {
        alphaIndexes[0]  ;

        for(int j = 0; j < alphaIndexes.Count; j  ) {
            if(alphaIndexes[j] >= alphaLetters.Length) {
                alphaIndexes[j] = 0;
                if (j < alphaIndexes.Count)
                    alphaIndexes[j 1]  ;
            }
        }
    }
    Numbers[n] = new String(numberLetters);
    Numbers[n].Dump();
}
  

Комментарии:

1. Но это может быть и не то, что вам нужно, извините, просто ваш вопрос не совсем ясен, сейчас я работаю над вашими разъяснениями