Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8

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

17.05.2016, 17:08. Показов 1263. Ответов 9
Метки нет (Все метки)

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

Распечатать все перестановки используя рекурсию
Есть проблема. Даны числа 1, 2, ... n Надо написать рекурсивную процедуру, которая распечатает все перестановки из этих чисел. ...

Вывести все слова из N букв, не используя рекурсию
Вводятся два числа N и M: слова (N букв) составленные из M букв русского алфавита. Задача - вывести все эти слова, не используя рекурсию. С...

Используя рекурсию распечатать последовательность
Ввести с клавиатуры целое число N. Используя рекурсию, распечатать сначала последовательность, состоящую из N букв 'А', а затем из N...

9
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
17.05.2016, 17:11
Цитата Сообщение от geh Посмотреть сообщение
решу сам и не подскажу
И не надо, мы и так знаем
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
17.05.2016, 17:17
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Option Explicit
Dim S_Msg As String
 
Private Sub Command1_Click()
  S_Msg = ""
  Pn "1122"
  MsgBox S_Msg
End Sub
 
Public Sub Pn(S As String, Optional SS As String = "")
Dim i As Integer
  If Len(S) = 1 Then
    S_Msg = S_Msg & SS & S & vbLf
  Else
    For i = 1 To Len(S)
      Pn Left$(S, i - 1) & Mid$(S, i + 1), SS & Mid$(S, i, 1)
    Next
  End If
End Sub
И останется только убрать повторы.
Миниатюры
Распечатать все перестановки используя рекурсию  (2)  
2
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
17.05.2016, 17:30  [ТС]

Не по теме:

SoftIce
Ваша шутка принимается...



Добавлено через 10 минут
SoftIce
Вы не могли бы пояснить ваш код.
Что-то уж очень мудрёно написано.

Добавлено через 1 минуту
Вся проблема в повторах!
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
17.05.2016, 17:31
Цитата Сообщение от geh Посмотреть сообщение
Что-то уж очень мудрёно написано.
C использованием рекурсии.

С удалением повторов
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Private Sub Command1_Click()
  S_Msg = ""
  Pn "1122"
  DeleteDoubleText S_Msg
  MsgBox S_Msg
End Sub
 
Public Sub Pn(s As String, Optional SS As String = "")
Dim i As Integer
  If Len(s) = 1 Then
    S_Msg = S_Msg & SS & s & vbLf
  Else
    For i = 1 To Len(s)
      Pn Left$(s, i - 1) & Mid$(s, i + 1), SS & Mid$(s, i, 1)
    Next
  End If
End Sub
 
Public Sub DeleteDoubleText(ByRef st As String)
        Dim a, Dict As Object, i As Integer, k As Integer, s() As String
        Set Dict = CreateObject("Scripting.Dictionary")
        a = Split(st, vbLf)
        For i = 0 To UBound(a)
            If Not Dict.Exists(a(i)) Then
                Dict.Add a(i), i
                ReDim Preserve s(k)
                s(k) = a(i)
                k = k + 1
            End If
        Next
        st = Join(s, vbLf)
End Sub
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
17.05.2016, 17:48  [ТС]
SoftIce
Спасибо! Это все конечно хорошо!
Но было бы лучше... Мне хотелось написать такой
рекурсивный код, чтобы в его работе ничего "лишнего"
не появлялось в ПРИНЦИПЕ. Иными словами, алгоритм
должен обходить все "подводные камни".
Спасибо!
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
17.05.2016, 18:00
Лучший ответ Сообщение было отмечено echs как решение

Решение

Цитата Сообщение от geh Посмотреть сообщение
"лишнего"
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Option Explicit
Dim Dict, S_Msg As String
 
Private Sub Command1_Click()
  Set Dict = CreateObject("Scripting.Dictionary")
  S_Msg = ""
  Pn "1122"
  MsgBox S_Msg
End Sub
 
Public Sub Pn(s As String, Optional SS As String = "")
Dim i As Integer, st As String
  If Len(s) = 1 Then
      st = SS & s
      If Not Dict.Exists(st) Then
          Dict.Add st, st
          S_Msg = S_Msg & st & vbLf
      End If
  Else
    For i = 1 To Len(s)
      Pn Left$(s, i - 1) & Mid$(s, i + 1), SS & Mid$(s, i, 1)
    Next
  End If
End Sub
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
17.05.2016, 18:36  [ТС]
SoftIce
Спасибо!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,683
Записей в блоге: 14
19.05.2016, 18:30
Лучший ответ Сообщение было отмечено echs как решение

Решение

Мои 5 коп:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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
1
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
19.05.2016, 19:05  [ТС]
Catstail
Спасибо за 5 копеек! Они дороже, чем 5 золотых
товарища Буратино!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.05.2016, 19:05
Помогаю со студенческими работами здесь

Используя рекурсию, распечатать последовательность, состоящую из N одинаковых букв
Дали задания, начал делать и понял что ничего не получается, подскажите как их сделать, а то голову уже сломал Язык СИ Задание 3:...

Распечатать количество различных разбиений числа на сумму натуральных слагаемых, используя рекурсию
Для данного натурального числа от 2 до 20 распечатайте количество его различных разбиений на сумму натуральных слагаемых. Например, для...

Распечатать все перестановки из N цифр
Задача такая. Допустим для простоты дано 5 цифр. Причем цифры могут быть и одинаковые, например 77777 Требуется распечатать все...

Используя рекурсию, напечатать сначала все отрицательные, а потом все положительные числа
Дана последовательность ненулевых целых чисел, признаком конца которых служит 0. Используя рекурсию, напечатать сначала все отрицательные,...

Ввести с клавиатуры целое число N. Используя рекурсию, распечатать сначала последовательность, состоящую из N букв 'А', а затем из N букв 'В'
. Ввести с клавиатуры целое число N. Используя рекурсию, распечатать сначала последовательность, состоящую из N букв 'А', а затем из N букв...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru