User 13204940 Ответов: 3

Генерация первого X числа перестановок


Я перепробовал так много методов, но просто не могу понять, как сгенерировать, например, первые 10 перестановок, когда задан массив символов.

Вот что я ищу:

символы = 'АБВГД'
количество = 10

Тогда выход должен быть таким:

один
б
с
д
aa
ab
пт
реклама
ба
бб

Есть ли простой способ достичь этого?

Что я уже пробовал:

---------------------------------------------------------------------------------------

3 Ответов

Рейтинг:
12

Patrice T

Цитата:
Есть ли простой способ достичь этого?

Да, но после 40 вопросов вы должны знать, что мы не делаем вашу домашнюю работу.
Цитата:
например первые 10 перестановок

Ваш пример вывода не является перестановкой!


[no name]

Я не получаю домашнее задание, я не ребенок.

Patrice T

Но вы все еще не знаете, что мы помогаем исправить ваш код, но я не вижу здесь никакого кода.

[no name]

Но я перепробовал так много различных функций, и ни одна из них не дает мне возможности подняться только до определенного числа, поэтому я ищу новый способ подойти к этому.

OriginalGriff

Честно говоря, если вы можете написать код для выполнения перестановок, но не имеете ни малейшего представления о том, как "остановиться после n значений", то вам действительно следует подумать о том, чтобы вернуться в школу и учиться снова - это тривиально! Это что, три строки кода, включая объявление переменной? Возможно, два, если вы используете предварительное приращение?

Maciej Los

5ed!

[no name]

Есть ли какая-то конкретная причина, когда она ничего не делает для решения этого вопроса?

Patrice T

Спасибо.

Рейтинг:
1

Maciej Los

Как я уже упоминал ранее (решение было удалено, поскольку оно было - по вашему мнению - не связано с вопросом), результат, который вы хотите получить, не является перестановка[^].

Если вы заинтересованы в реализации метода, который производит набор последовательностей,
Основываясь на ссылке, предоставленной в решении № 1 компанией OriginalGriff[^], я перевел Linq C# GetPermutations метод в VB.NET форма:

Sub Main
	
	Dim chars As String = "ABCD"
	Dim count = 10
	'get 10 permutations of ABCD arranged into 3-part sequences 
	Dim result = GetPermutations(chars.ToArray(), 3).Take(count)

	For Each r In result
		Console.WriteLine("{0}", String.Join("", r))
	Next
	
End Sub

Function GetPermutations(Of T)(list AS IEnumerable(Of T), length As Integer) AS IEnumerable(Of IEnumerable(Of T)) 

    If length = 1 Then Return list.Select(Function(o) New T(){o})

    Return GetPermutations(list, length - 1) _
        .SelectMany(Function(a) list.Where(Function(e) Not a.Contains(e)), Function(t1, t2) t1.Concat(New T(){t2}))
		
End Function


Приведенный выше код дает 10 результатов, например:
ABC
ABD
ACB
ACD
ADB
ADC
BAC
BAD
BCA
BCD


В случае, если вы хотите получить результат N-части, вам нужно улучшить приведенный выше код:
For i = 1 To chars.Length
		Dim result = GetPermutations(chars.ToArray(), i).Take(count)
		For Each r In result
			Console.WriteLine("{0}", String.Join("", r))
		Next
	Next


Если вы хотите получить не-Linq решение, вы должны реализовать свое собственное Swap и GetPer методы, предлагаемые так.