假设我们必须创建一个计算器,它的第一个功能就是Fatorial. 我们可以将它写为递归函数或使用循环来获得结果. 我们都知道递归更慢,因为它具有指数性质. 但是如何通过代码证明它而不是
我们可以将它写为递归函数或使用循环来获得结果.
我们都知道递归更慢,因为它具有指数性质.
但是如何通过代码证明它而不是通过计算线?
我曾尝试计算花费的毫秒数,但是对于我的i7,它在初始时间和代码停止之间始终为零.
如何衡量循环和递归方法之间的代码速度差异?
type
TJanela = class(TForm)
Instrucao: TLabel;
Entrada: TEdit;
Botao: TButton;
procedure Calcular(Sender: TObject);
end;
var
Janela: TJanela;
Val, Fat, Start, TimeRecursive, TimeLoop: Int64;
function FR(N: Int64): Int64; // Fatorial Recursivo
function FL(N: Int64): Int64; // Fatorial em Loop
implementation
{$R *.dfm}
procedure TJanela.Calcular(Sender: TObject);
begin
Val := StrToInt(Entrada.Text);
Start := StrToInt(FormatDateTime('nnsszzz',Now));
Fat := FR(Valor);
TimeRecursive := StrToInt(FormatDateTime('nnsszzz',Now)) - Start;
Start := StrToInt(FormatDateTime('nnsszzz',Now));
Fat := FL(Valor);
TimeLoop := StrToInt(FormatDateTime('nnsszzz',Now)) - Start;
if Val > 25 then
ShowMessage('Delphi can't calculate above [ 25! ]')
else
ShowMessage(' [ ' +
IntToStr(Val) + '! ] is equal to [ ' +
FormatFloat('###,###,###,###,###,###',Fat) + ' ]'#13#13+
'Recursive: [ ' + IntToStr(TimeRecursive) + ' ] ms;'#13+
'Loop: [ ' + IntToStr(TimeLoop) + ' ] ms;');
end;
function FR(N: Int64): Int64;
begin
if N <= 1 then
Result := 1
else
Result := N * FR(N - 1);
end;
function FL(N: Int64): Int64;
var
I: Integer;
begin
for I := 2 to N - 1 do
N := N * I;
if N = 0 then
Result := 1
else
Result := N;
end;
既然大卫得到了答案,我在Mathematics上提出了一个问题,这样他们就可以帮助我找出两个方程来确定给定因子在这两种方法中花费在计算机上的近似时间.
您正在使用相当低分辨率的计时器,并且对因子函数的单一评估太快甚至无法注册.您可以使用更高分辨率的计时器,但到目前为止,最简单的方法是计算需要更长时间的计时器.而不是计算一次对阶乘的调用,时间一千或一百万.
如果您真的对实现快速因子函数感兴趣,对于整数输入,那么您应该使用查找表.
对于它的价值,我认为诊断单元中的TStopWatch比日期/时间功能更方便定时.
