Распечатать все перестановки используя рекурсию (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
Листинг программы
  1. Function Perms(A As String) As String()
  2. Dim R() As String
  3. Dim Z() As String
  4.     l& = Len(A)
  5.     If l& = 2 Then
  6.        ReDim R(1 To 2) As String
  7.        R(1) = A
  8.        R(2) = Right$(A, 1) & Left$(A, 1)
  9.     Else
  10.        s$ = Left$(A, 1)
  11.        Z = Perms(Mid$(A, 2))
  12.        n& = UBound(Z, 1)
  13.        ReDim R(1 To n& * l&) As String
  14.        p& = 1
  15.        For i& = 1 To n&
  16.            U$ = Z(i&)
  17.            For k& = 1 To l&
  18.                lu$ = Left$(U$, (k& - 1))
  19.                ru$ = Mid$(U$, k&)
  20.                R(p&) = lu$ & s$ & ru$
  21.                p& = p& + 1
  22.            Next k&
  23.        Next i&
  24.     End If
  25.     Perms = R
  26. End Function
  27.  
  28. Sub Test()
  29. Dim R() As String
  30.     A$ = "1234"
  31.     R = Perms(A$)
  32.     For i& = 1 To UBound(R, 1)
  33.         Debug.Print R(i&)
  34.     Next i&
  35. End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

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

11   голосов , оценка 4.364 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы