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