Нужна рекурсивная функция для генерации уникальной комбинации строк

2

У меня есть некоторые (скажем 9, не определенные) уникальные строки из базы данных (A, B, C, D, E, F, G, H), и я хочу создать уникальную комбинацию этих полей для заполнения списка что пользователь может выбрать одну или другую комбинацию этих строковых полей как А, В, С, D, Е, F, G, Н, AB, AC, AD, AE, AF, AG, AH, AC, AD, AE, AF, AG, AG, AH,... ABC, ABD, ABE, ABF, ABG, ABH, ACD, ACE, ACF, ACG, ACH,.....

В С# (приложение win) Спасибо заранее

  • 0
    Учитывая, что вы сохраняете порядок, у вас будет 2 ** 9 = 512 возможных сгенерированных строк. Это серьезно проверит пределы терпения ваших пользователей, если вы поместите все это в список для выбора.
Теги:
function
recursion

3 ответа

8

Мой первый выбор будет "использовать CheckedListBox и позволить пользователю самостоятельно выбирать" - это спасет их разумность... вы бы хотели найти "ABCEFH" в длинном списке?).

Если вам нужны строки: Как насчет использования бинарной арифметики? т.е. использовать число (длину бит в соответствии с количеством элементов) и просто продолжать увеличивать, включая заданные биты каждый раз? Итак, в С#, например:

static void Main()
{
    foreach (string value in GetCombinations(
        "A", "B", "C", "D", "E", "F", "G", "H"))
    {
        Console.WriteLine(value);
    }
}
static IEnumerable<string> GetCombinations(params string[] tokens)
{
    ulong max = (ulong) 1 << tokens.Length;
    StringBuilder builder = new StringBuilder();
    // test all bitwise combinations
    for (ulong value = 0; value < max; value++)
    {
        builder.Length = 0;
        ulong tmp = value;
        // include the tokens for the set bits
        for (int i = 0; i < tokens.Length; i++)
        {
            if ((tmp & (ulong)1) == 1) builder.Append(tokens[i]);
            tmp >>= 1;
        }
        yield return builder.ToString();
    }
}

Если вам нужны данные в порядке вашего примера, полезно использовать LINQ:

    foreach (string value in GetCombinations(
          "A", "B", "C", "D", "E", "F", "G", "H")
        .OrderBy(s=>s.Length)
        .ThenBy(s=>s))
    {
        Console.WriteLine(value);
    }
1

Комбинация общедоступного класса {   static int count = 0;

public static void main(String[] args)
{
    StringBuilder out = new StringBuilder("");
    StringBuilder str = new StringBuilder("aabcbd");

    combination(str, out, 0);
    System.out.println("The Count : " + count);
}


// Recursive
static void combination(StringBuilder in, StringBuilder out, int start)
{
    int len = in.length();

    for (int i = start; i < len; i++)
    {
        if (isAppended(in, out, i))
        {
            continue;
        }

        out.append(in.charAt(i));
        count++;
        System.out.println(out);
        combination(in, out, i + 1);
        out.deleteCharAt(out.length() - 1);
    }
}


static boolean isAppended(StringBuilder in, StringBuilder out, int index)
{
    int inCount = 0;
    int outCount = 0;

    int i = 0;
    int len = out.length();
    char ch = in.charAt(index);

    for (i = 0; i < index; i++)
    {
        if (in.charAt(i) == ch)
        {
            inCount++;
        }
    }

    for (i = 0; i < len; i++)
    {
        if (out.charAt(i) == ch)
        {
            outCount++;
        }
    }

    if (inCount != outCount)
    {
        return true;
    }

    return false;
}

}

0

Это как подсчет целых чисел в базе 'n'.. не должно быть затруднительным.

  • 0
    Но мне нужна уникальная комбинация, а не двойные (AA, BB) или повторные комбинации (AB, BA)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню