创建未知数量的循环
Posted
技术标签:
【中文标题】创建未知数量的循环【英文标题】:Create an Unknown Number of Loops 【发布时间】:2012-08-21 08:35:13 【问题描述】:这是我生成的简单代码 一个集合的所有可能组合 例子
1,2,3:
显示: 123 132 213 231 312 321我想创建可变数量的 for 循环,让用户确定给定字符串的长度...
有没有人有想法...
先谢谢了。
type
TNumber = '0'..'9';
procedure TForm1.Button1Click(Sender: TObject);
var
Numbers: array[0..3] of TNumber;
a, b, c, d: Integer;
s: string;
begin
Numbers[0] := '1';
Numbers[1] := '8';
Numbers[2] := '7';
Numbers[3] := '2';
for a := low(Numbers) to High(Numbers) do
for b := low(Numbers) to High(Numbers) do
for c := low(Numbers) to High(Numbers) do
for d := low(Numbers) to High(Numbers) do
begin
s := Numbers[a] + Numbers[b] + Numbers[c] + Numbers[d];
if
(Occurrences('1', s) > 1 ) or
(Occurrences('8', s) > 1 ) or
(Occurrences('7', s) > 1 ) or
(Occurrences('2', s) > 1 )
then
Continue
else
Memo1.Lines.Add(s);
end;
end;
function TForm1.Occurrences(const Substring, Text: string): Integer;
var
Offset: Integer;
begin
Result := 0;
Offset := PosEx(Substring, Text, 1);
while Offset <> 0 do
begin
Inc(Result);
Offset := PosEx(Substring, Text, offset + length(Substring));
end;
end;
结束。
【问题讨论】:
如已接受的答案中所述,此功能的术语称为递归。 【参考方案1】:这里有一些代码可以产生你想要的输出。您需要根据自己的需要对其进行一些修改,但这个递归解决方案中表达的概念很重要:
program Permuatations;
$APPTYPE CONSOLE
type
TElements = '1'..'3';
procedure EnumerateCombinations(const Stem: string; Len: Integer);
var
i: Integer;
el: TElements;
Used: set of TElements;
begin
if Len=0 then
exit;
Used := [];
for i := 1 to Length(Stem) do
Include(Used, Stem[i]);
for el := low(el) to high(el) do
begin
if el in Used then
continue;
if Len=1 then
Writeln(Stem+el)
else
EnumerateCombinations(Stem+el, Len-1)
end;
end;
procedure Main;
begin
EnumerateCombinations('', 1+ord(high(TElements))-ord(low(TElements)));
end;
begin
Main;
Readln;
end.
输出:
123
132
213
231
312
321
如果您将TElements
的定义更改为'1'..'4'
,那么您将看到24 种可能的排列。
【讨论】:
+1,不错。这里有更多关于排列主题的算法:Calculating Permutations and Job Interview Questions.以上是关于创建未知数量的循环的主要内容,如果未能解决你的问题,请参考以下文章
drools when写条件判断时能加循环吗?我有多个条件要进行判断,而且条件的数量未知。