Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Генерация всех возможных комбинаций слов

Delphi , Синтаксис , Синтаксис

В данной статье мы рассмотрим задачу генерации всех возможных комбинаций слов из заданного набора. Для этого мы предложим два решения на языке Object Pascal (Delphi).

Решение 1: Рекурсивная функция

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

procedure TForm1.generarCombinaciones(const elementos: TStringList;
  const combinacion: string; inicio: Integer);
var
  i: Integer;
begin
  if combinacion <> '' then
    ShowMessage(combinacion);

  for i := inicio to elementos.Count-1 do
    GenerarCombinaciones(elementos, combinacion + elementos.Strings[i] + ' ', i + 1);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
   sl : TStringList;
begin
   sl := TStringList.Create;
   sl.Add('Mark');
   sl.Add('Anna');
   sl.Add('John');
   sl.Add('Martha');

   generarCombinaciones(sl,'',0);

   sl.free;
end;

Эта функция generarCombinaciones принимает в качестве параметров список слов, текущую комбинацию и индекс начала генерации. Если текущая комбинация не пустая, она выводится на экран. Затем функция рекурсивно вызывается для каждого слова в списке начиная с заданного индекса.

Решение 2: Рекурсивный подход с использованием битовых массивов

Второе решение основано на рекурсивном подходе, который использует битовые массивы для отслеживания использованных слов. Ниже приведен пример такой реализации:

program Project_delphi_stackoverflow;

{$APPTYPE CONSOLE}
{$R *.res}

uses
  System.SysUtils, Types, Classes;

procedure GeneratePermutations(input_list: TStringList; output_list: TStringList; current_combination: TStringList; used: TBits);
var
  i: Integer;
  combination: string;
begin
  if current_combination.Count > 0 then
  begin
    combination := Trim(current_combination.DelimitedText);
    output_list.Add(combination);
  end;

  for i := 0 to input_list.Count - 1 do
  begin
    if not used[i] then
    begin
      used[i] := True;
      current_combination.Add(input_list[i]);
      GeneratePermutations(input_list, output_list, current_combination, used);
      current_combination.Delete(current_combination.Count - 1);
      used[i] := False;
    end;
  end;
end;

procedure OutputCombinations(output_list: TStringList);
var
  combination: string;
begin
  WriteLn('----------------------------------------------------------');
  WriteLn(Format('Number of combinations: %d', [output_list.Count]));
  WriteLn('----------------------------------------------------------');
  for combination in output_list do
    WriteLn(combination);
  WriteLn;
end;

var
  input_list, output_list, current_combination: TStringList;
  used: TBits;

begin
  input_list := TStringList.Create;
  output_list := TStringList.Create;
  current_combination := TStringList.Create;
  used := TBits.Create;
  try
    // Your test data N=4
    input_list.Add('Mark');
    input_list.Add('Anna');
    input_list.Add('John');
    input_list.Add('Martha');
    used.Size := input_list.Count;

    GeneratePermutations(input_list, output_list, current_combination, used);
    OutputCombinations(output_list);

    // Your test data N=5
    input_list.Add('Joe');
    output_list.Clear;
    used.Size := input_list.Count;

    GeneratePermutations(input_list, output_list, current_combination, used);
    OutputCombinations(output_list);

    // Your test data N=6
    input_list.Add('Alice');
    output_list.Clear;
    used.Size := input_list.Count;

    GeneratePermutations(input_list, output_list, current_combination, used);
    OutputCombinations(output_list);


    // Your test data N=4
     input_list.Clear;
    input_list.Add('Mark');
    input_list.Add('Anna');
    input_list.Add('Mark');
    input_list.Add('Martha');
    used.Size := input_list.Count;

    GeneratePermutations(input_list, output_list, current_combination, used);
    OutputCombinations(output_list);

  finally
    input_list.Free;
    output_list.Free;
    current_combination.Free;
    used.Free;
  end;

  ReadLn;
end.

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

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

Данная статья рассматривает задачу генерации всех возможных комбинаций слов из заданного набора с помощью двух решений на языке Object Pascal (Delphi).


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Синтаксис ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-08-19 13:29:56
2024-11-21 14:21:03/0.0053930282592773/1