Распечатать все перестановки используя рекурсию - VB
Формулировка задачи:
Есть проблема. Даны числа 1, 2, ... n
Надо написать рекурсивную процедуру, которая распечатает
все перестановки из этих чисел.
Мне известна обычная (нерекурсивная) процедура
В интернете нашел и иную экзотическую процедуру
на Паскале. А рекурсивной не нашел. Стал делать сам.
Для простоты возьмем 3 числа (1,2,3)
(Числа задаются массивом A ())
Общая схема рекурсивно процедуры:
0. Вызов рекурсивной процедуры Call Recursia (A(), n) (n=3 - размер массива)
1. Печатаем число 1
2. Образуем массив A(1)=2, A(2)=3
3. Call Recursia (A(), n-1)
4. Печатаем число 2
5. Образуем массив A(1)=1, A(2)=3
6. Call Recursia (A(), n-1)
7. Печатаем число 3
8. Образуем массив A(1)=1, A(2)=2
9. Call Recursia (A(), n-1)
Все это можно записать короче. Но программа не работает.
Что она печатает.
1. Есть повторяющиеся элементы
2. Есть строки где на один элемент меньше
3. Есть дублирующиеся строки
Мое мнение об ошибках.
Основная стратегическая линия построения рекурсии верна
Но.
Самый уязвимый элемент, мне так кажется, это МАССИВ.
Ведь он меняется и его надо восстанавливать. Однако
Запасной (неизменяемый) массив результатов не дал.
Вывод:
Две недели решения этой задачи ничего не дали.
Решил обратиться на форум. Если никто не решит, то
все брошу и решу сам.
Решение задачи: «Распечатать все перестановки используя рекурсию»
textual
Листинг программы
- Dim x() As Integer
- Dim n As Integer
- Public Function Swap(ByRef x As Integer, ByRef y As Integer)
- Dim temp As Integer
- temp = x
- x = y
- y = temp
- End Function
- Sub Generate(k As Integer)
- Dim i As Integer, j As Integer
- If k = n Then
- For i = 1 To n
- S$ = S$ & x(i) ' Собираем строку
- Next
- Form1.Print S$ ' вывод на окно
- S$ = ""
- Else
- For j = k + 1 To n
- Swap x(k + 1), x(j)
- Generate k + 1
- Swap x(k + 1), x(j)
- Next
- End If
- End Sub
- Private Sub Form_Activate()
- Dim i As Integer
- n = 3
- ReDim x(1 To n)
- For i = 1 To n
- x(i) = i
- Next
- Generate 0
- End Sub
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д