你可以改变你的内循环:
for j := 1 to i + 1 do
begin
if ( length(s) > n*2 ) then
begin
Break;
end;
str(i,c);
s:= s + c+',';
end;
首先,为了清楚起见,我建议你总是缩进,所以
for j := 1 to i + 1 do
begin
if ( length(s) > n*2 ) then
begin
Break;
end;
str(i,c);
s:= s + c+',';
end;
其次,您只需要begin
andend
将多个语句转换为单个语句,因此由于您只进入break
其中,因此它们是多余的-只需直接使用 break :
for j := 1 to i + 1 do
begin
if ( length(s) > n*2 ) then Break;
str(i,c);
s:= s + c+',';
end;
接下来,请注意您正在重新计算c
很多:
str(i,c);
suffix = c + ',';
for j := 1 to i + 1 do
begin
if ( length(s) > n*2 ) then Break;
s:= s + suffix;
end;
我不是很热衷于使用 break 因为它感觉像是一个 goto,所以也许你可以把它改成一个repeat ... until
块:
str(i,c);
suffix = c + ',';
j := 1;
repeat
s := s + suffix;
j := j + 1;
until (j > i+1) or (length (s) > n*2);
(请注意,repeat
anduntil
带有一个隐含的begin
,end
因此您不需要键入它们。)
现在您可能会争辩说,我降低了清晰度,因为它不那么明显循环只是增加了j
. 在这种情况下,无论您喜欢什么,我都不会感到强烈,但是如果您经常使用 break ,请考虑是否while
对repeat
您更好。
你的情况length (s) > n*2
让我感到困惑(没有其他人把它放在你的代码版本中)。您似乎出于某种原因想缩短它。你确定吗?我不是。下面是你得到的无限制输出的表格,然后是输出的前 n*2 项,以及字符串的前 n*2 个字符,所以你可以检查一下。该break
声明的目的是什么?
n: 1
output: 1,1
length: 2
n*2: 2
first n*2 numbers: 1,1
first n*2 characters: 1,
n: 2
output: 1,1,2,2,2
length: 5
n*2: 4
first n*2 numbers: 1,1,2,2
first n*2 characters: 1,1,
n: 3
output: 1,1,2,2,2,3,3,3,3
length: 9
n*2: 6
first n*2 numbers: 1,1,2,2,2,3
first n*2 characters: 1,1,2,
n: 4
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4
length: 14
n*2: 8
first n*2 numbers: 1,1,2,2,2,3,3,3
first n*2 characters: 1,1,2,2,
n: 5
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5
length: 20
n*2: 10
first n*2 numbers: 1,1,2,2,2,3,3,3,3,4
first n*2 characters: 1,1,2,2,2,
n: 6
output: 1,1,2,2,2,3,3,3,3,4,4,4,4,4,5,5,5,5,5,5,6,6,6,6,6,6,6
length: 27
n*2: 12
first n*2 numbers: 1,1,2,2,2,3,3,3,3,4,4,4
first n*2 characters: 1,1,2,2,2,3,