получить комбинации с повторением - PullRequest
1 голос
/ 26 мая 2011

Как я могу записать все возможные комбинации на консоль? Например, если пользователь вводит abc, он будет писать aaa, aab, aac, abb, abc, acc, bbb, bbc, ccc. Пожалуйста, помогите мне.

Вот код:

    Dim abc() As String = {"a", "b", "c"} '      

    Sub Main()
        Console.WriteLine("Enter the amount of characters")
        Dim count As Integer = Console.ReadLine
        outputStrings("", count)

        Console.ReadLine()
    End Sub

    Private Sub outputStrings(ByVal startString As String, ByVal letterCount As Integer)
        For i = 0 To abc.Length - 1
            Dim temp As String = startString           
            temp += abc(i)
            If temp.Length = letterCount Then
                Console.WriteLine(temp)

                If i = abc.Length - 1 Then
                    Console.WriteLine("----")    
                End If
            Else
                outputStrings(temp, letterCount)
            End If

        Next
    End Sub

Что-то должно быть сделано после пунктирных линий, чтобы удалить нежелательную перестановку, чтобы исключить только допустимые комбинации.

Ответы [ 4 ]

1 голос
/ 26 мая 2011

Вы можете ограничить количество используемых букв до или справа от abc (i) дополнительным параметром abcIndex и запустить цикл for оттуда. Будут записаны только строки с буквами в алфавитном порядке, что исключает дублирование.

Private Sub outputStrings(ByVal startString As String, ByVal letterCount As Integer, ByVal abcIndex As Integer)
    For i = abcIndex To abc.Length - 1
        Dim temp As String = startString
        temp += abc(i)
        If temp.Length = letterCount Then
            Console.WriteLine(temp)
        Else
            outputStrings(temp, letterCount, i)
        End If
    Next
End Sub

Позвонить по номеру:

outputStrings("", 3, 0)
1 голос
/ 26 мая 2011
def go(chars,thusfar):
    if len(thusfar) = len(chars):
        print thusfar
    for char in chars:
        go(chars,thusfar+char);

Это должно быть достаточно просто для перевода на VB (читай: я не знаю VB)

0 голосов
/ 11 ноября 2017

Удивительный код от здесь:

Private Shared Function PermutationsWithRepetition(Of T)(list As IEnumerable(Of T), length As Integer) As IEnumerable(Of IEnumerable(Of T))
        If length = 1 Then
            Return list.[Select](Function(x) New T() {x})
        End If
        Return PermutationsWithRepetition(list, length - 1).SelectMany(Function(x) list, Function(t1, t2) t1.Concat(New T() {t2}))
    End Function

Может использоваться с Integer, Char, Double и т. Д. Пример использования:

Dim myarray(1) As Integer
myarray(0) = 1
myarray(1) = 2
Dim k As Integer = 2 'number of "slots" to do the permutations

mypermutations = PermutationsWithRepetition(myarray,k)

For Each row As IEnumerable(Of Integer) In mypermutations
            Console.WriteLine("")
            For Each col As IntegerIn row
                Console.Write(col.toString())
            Next            
Next

Выход:

11 12 21 22

0 голосов
/ 26 мая 2011

Вам просто нужно сделать рекурсивный вызов там.

Dim abc() As String = {"a", "b", "c"} '      

Sub Main()
    Console.WriteLine("Enter the amount of characters")
    Dim count As Integer = Console.ReadLine
    outputStrings("", count)

    Console.ReadLine()
End Sub

Private Sub outputStrings(ByVal startString As String, ByVal letterCount As Integer)
    For i = 0 To abc.Count - 1
        Dim temp As String = startString           
        temp += abc(i)
        If temp.Length = letterCount Then
            Console.WriteLine(temp)
        Else
            outputStrings(temp, letterCount)
        End If

    Next
End Sub

Обратите внимание, что если кто-то введет отрицательное число, ваш код будет работать вечно. Я оставлю это как простое упражнение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...