【发布时间】:2017-05-21 12:12:16
【问题描述】:
我有一个包含多个变量的函数 f(例如 3 个变量 f(x,y,z))。我想计算每个变量范围的函数结果并将它们存储在一个列表中。对于 3 个变量,这可能如下所示:
procedure LoopOver3Dimensions;
type
TListItem=record
x, y, z: Real;
CalculationResult: Real;
end;
var
List: TList<TListItem>;
NewListItem: TListItem;
i, j, k: Integer;
x, y, z: Real;
xStart, yStart, zStart: Real;
xEnd, yEnd, zEnd: Real;
NumberOfValuesToCalculateForDimension0: Integer;
NumberOfValuesToCalculateForDimension1: Integer;
NumberOfValuesToCalculateForDimension2: Integer;
begin
//set xStart, xEnd, NumberOfValuesToCalculateForDimension0 etc here
for i := 0 to NumberOfValuesToCalculateForDimension0 do
begin
x:=xStart+i*Abs(xEnd-xStart)/(NumberOfValuesToCalculateForDimension0-1);
for j := 0 to NumberOfValuesToCalculateForDimension1 do
begin
y:=yStart+j*Abs(yEnd-yStart)/(NumberOfValuesToCalculateForDimension1-1);
for k := 0 to NumberOfValuesToCalculateForDimension2 do
begin
z:=zStart+k*Abs(zEnd-zStart)/(NumberOfValuesToCalculateForDimension2-1);
NewListItem.x:=x;
NewListItem.y:=y;
NewListItem.z:=z;
NewListItem.CalculationResult:=DoCalculation(x, y, z);
List.Add(NewListItem);
end;
end;
end;
end;
我当然可以以相同的方式对超过 3 个维度(例如 20 个维度)进行编程,但这会变得非常麻烦,而且由于所有内容都是硬编码的,因此我无法在运行时更改维度数。
最好的方法是什么?
【问题讨论】:
-
如果您要在单独的参数中传递每个参数,那么您需要动态调用函数或硬编码。更好的可能是将参数传递到数组中。如果您真的有 20 个参数,那么您将没有时间或内存来更改所有参数。
-
正如@David 所说,使用(动态)数组而不是 x、y、z。并循环遍历维度,而不是对嵌套循环进行硬编码。
-
当然,循环遍历维度也有点棘手。您需要一个整数数组,长度等于维度计数。和一个增量函数。还有一个终止条件。
-
@David 您能否为我们概述一下这样的实现?谢谢!
标签: algorithm loops delphi iteration