Распечатать все перестановки используя рекурсию (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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д