Распечатать все перестановки используя рекурсию (2) - VB

Узнай цену своей работы

Формулировка задачи:

Полгода назад я создавал тему с точно таким названием На этот раз задача сложнее ранее предлагавшейся Дано N цифр. Среди них могут быть и РАВНЫЕ. (Тогда задача была решена, если все цифры разные) Требуется распечатать все перестановки из этих цифр с использованием рекурсии. Пример. Дано 1122 Надо получить 1122 1212 1221 2112 2121 2211 Решение. разместим все цифры в массив A() (Наверное можно массив отсортировать? Нужно ли?) 1. Берем в качестве первой цифры A(1) 2. И задача сводится к перестановкам из N - 1 цифры Это теория. И на практике будут распечатана все N! перестановок... Как избавиться от лишних? - ЭТО САМАЯ ГЛАВНАЯ ПРОБЛЕМА! 3. Далее берется в качестве второй цифры A(2)?? А если A(1) = A(2) ? Ума не приложу как организовать рекурсию? Вероятно цикл нужен. А вот все цифры, кандидаты на первое Место должны выступать только ОДИН РАЗ. Есть смысл создать для них специальный массив B()? Ребята, подскажите. В противном случае - решу сам и не подскажу.

Решение задачи: «Распечатать все перестановки используя рекурсию (2)»

textual
Листинг программы
Function Perms(A As String) As String()
Dim R() As String
Dim Z() As String
    l& = Len(A)
    If l& = 2 Then
       ReDim R(1 To 2) As String
       R(1) = A
       R(2) = Right$(A, 1) & Left$(A, 1)
    Else
       s$ = Left$(A, 1)
       Z = Perms(Mid$(A, 2))
       n& = UBound(Z, 1)
       ReDim R(1 To n& * l&) As String
       p& = 1
       For i& = 1 To n&
           U$ = Z(i&)
           For k& = 1 To l& 
               lu$ = Left$(U$, (k& - 1))
               ru$ = Mid$(U$, k&)
               R(p&) = lu$ & s$ & ru$
               p& = p& + 1
           Next k&
       Next i&
    End If
    Perms = R
End Function
 
Sub Test()
Dim R() As String
    A$ = "1234"
    R = Perms(A$)
    For i& = 1 To UBound(R, 1)
        Debug.Print R(i&)
    Next i&
End Sub

Оцени полезность:

11   голосов , оценка 4.364 из 5
Похожие ответы