Функциональные шаги в паскале - PullRequest
0 голосов
/ 08 апреля 2019

У меня есть следующий код, результат 42, но почему?Ответ должен быть 13, потому что 7+6=13.

program HelloWorld;

function F (a : integer) : integer;
begin
  if (a = 1) or (a = 2) then
    F := 2
  else
    F := F(a-1) + F(a-2);
end;

begin
  WriteLn(F(8));
end.

Ответы [ 2 ]

4 голосов
/ 08 апреля 2019

Вы не добавляете просто 7+6, как вы утверждаете.Если вы хотите это, вам нужно изменить эту строку:

F := F(a-1) + F(a-2);

Вместо этого:

F := (a-1) + (a-2);

В противном случае вы фактически добавляете F(7)+F(6), что:

(F(6) + F(5)) + (F(5) + F(4))

То есть:

((F(5) + F(4)) + (F(4) + F(3))) + ((F(4) + F(3)) + (F(3) + F(2)))

и т. Д. Для каждого рекурсивного вызова F(a), где a > 2.Вот почему вы получите 42 вместо 13.

0 голосов
/ 03 мая 2019
function f(a : Integer) : Integer;
begin
   if (a=1) OR (a=2) then
    Result := 2
   else
    Result := (a-1) + (a-2);                                                        
end;

f(8)
Result = 13
...