У меня есть следующий код, результат 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.
Рассматривали ли вы возможность использования отладчика?
Этот пост, возможно, будет жить здесь вечно. Поэтому мы хотим сделать его понятным и хорошо отформатированным для будущих посетителей. Как новый пользователь, вы должны взять тур. Фактически, это является частью процесса регистрации. Вы, наверное, пропустили это?
Вы можете прочитать о рекурсивном вычислении Последовательность Фибоначчи — функция retuen удвоилась Fib(a)
. Кстати, 42 - универсальный ответ;)
Я запутался, где вы назначаете результат функции? Я ожидал увидеть Result :=
, а не F :=
.
@JerryDodge F :=
— это синтаксис Паскаля для присвоения результата функции.
@KeithMiller Интересно, я всегда использовал Result
для присвоения результата. Никогда не знал, что можно использовать одно и то же имя функции для присвоения результата.
@JerryDodge В то время введение Result
в Delphi 1 было значительным улучшением по сравнению с назначением TP имени функции. Это значительно упростило изменение имени функции при рефакторинге и т. д.
Назначение @JerryDodge Result
допустимо в Delphi, только если Расширенный синтаксис включен, что по умолчанию.
Вы не добавляете просто 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.
я не понимаю, как насчет F(4), результат 6
F(4)
возвращает F(3) + F(2)
, которое возвращает (F(2) + F(1)) + 2
, которое возвращает (2 + 2) + 2
, то есть 6
FWIW, F(n) возвращает 2*Fibonacci(n-1): 2, 2, 4, 6, 10, 16, 26, 42, 68, 110. Имеет смысл. @Clarys: Пожалуйста, прочитайте о рекурсия, чтобы понять, что здесь происходит.
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
FWIW, такие фрагменты кода, как у вас, предназначены только для JavaScript. Не работает в Паскале. Я удалил гизмо «Выполнить фрагмент кода».