Последовательность фибоначчи программа паскаль

Числа Фибоначчи — это значения числовой последовательности, в которой, первые два числа равны единице, а каждый последующий элемент равен сумме предыдущих двух чисел.

Последовательность Фибоначчи имеет вид:
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610…

Функционально последовательность можно записать как:

Программа рекурсивного вычисления и вывода N первых членов последовательности Фибоначчи

program FibonacciNumbers; var N, i, f : integer; function FibonacciNumber(number : integer) : integer; begin if (number = 0) or (number = 1) then FibonacciNumber := 1 else FibonacciNumber := FibonacciNumber(number — 1) + FibonacciNumber(number — 2); end; begin write(‘N = ‘); readln(N); writeln(N, ‘ первых числа Фибоначчи’); for i := 0 to N — 1 do begin f := FibonacciNumber(i); write(f); if i < N — 1 then write(‘, ‘); end; readln; end.

Поиск чисел Фибоначчи с помощью рекурсивных вызовов очень не эффективно. Дело в том, что для вычисления каждого элемента необходимо сначала вычислить значения двух предыдущих, а для каждого из них — двух предыдущих, и так далее. Получаем дерево рекурсивных вызовов. Для оптимизации алгоритма, достаточно запоминать два предыдущих элемента ряда Фибоначчи.

Числа Фибоначчи и треугольник Паскаля

Оптимизированная программа поиска чисел Фибоначчи

program FibonacciNumbers; var N, i, f : integer; function FibNum(num : integer) : integer; var nm1 : integer; nm2 : integer; begin nm1 := 1; nm2 := 1; if (num = 0) or (num = 1) then FibNum := 1 else for i := 2 to num do begin FibNum := nm1 + nm2; nm2 := nm1; nm1 := FibNum; end; end; begin write(‘N = ‘); readln(N); writeln(N, ‘ первых членов последовательности Фибоначчи’); for i := 0 to N — 1 do begin f := FibNum(i); writeln(‘fib(‘, i:2,’) = ‘, f:8); end; readln; end.

Программа вычисления чисел ряда Фибоначчи по рекуррентной формуле без запоминания членов

Program Pr39(Input, Output); Var N : Integer; X1, X2, Y : LongInt; i : Integer; Begin WriteLn (‘PASCAL: Вычисление чисел Фибоначчи ‘); WriteLn (‘по рекуррентной формуле без запоминания членов.’); Write (‘Введите количество членов (3<=N<=50):N = ‘); ReadLn (N); WriteLn (‘Ваши ‘, N, ‘ членов:’); Write (‘1 1 ‘); X1 := 1; X2 := 1; For i := 3 To N Do Begin Y := X1 + X2; Write (Y); Write (‘ ‘); X1 := X2; X2 := Y; End; ReadLn; End.

Программа вычисления чисел ряда Фибоначчи по рекуррентной формуле с запоминанием членов

Program pr40 (Input, Output); Var X : Array [1..50] Of Integer; N : Integer; i : Integer; Begin Write (‘PASCAL: Вычисление чисел Фибоначчи ‘); WriteLn (‘по рекуррентной формуле c запоминанием членов.’); Write (‘Введите количество членов (3<=N<=50):N = ‘); ReadLn (N); X [1] := 1; X [2] := 1; WriteLn (‘Вычисленные члены:’); Write (‘1 1 ‘); For i := 3 To N Do Begin X [i] := X [i — 2] + X [i — 1]; Write (X [i]); Write (‘ ‘); End; ReadLn; End.

Читайте также:
Что такое программа кадрового аудита

Похожие записи/страницы:

  • Вычислить сумму всех чисел Фибоначчи, которые не превосходят заданного натурального числа М — Pascal(Паскаль)
  • Найти произведение цифр заданного четырехзначного числа — Pascal(Паскаль)
  • Дано множество целых чисел от 1..100. Убрать все числа фибоначчи, и найти кол-во убранных чисел! Решить через множество…
  • Найти произведение цифр заданного целого четырехзначного числа — Pascal(Паскаль)
  • Найти произведение цифр заданного целого четырехзначного числа — Pascal(Паскаль)
  • Определить все делители данного числа, включая единицу — Pascal(Паскаль)
  • Определить все делители целого числа М, включая 1 — Pascal(Паскаль)
  • Вывести последовательность n чисел Фибоначчи. Первые два числа равны 1, а каждое последующее — сумме двух предыдущих-…

Источник: retrolib.ru

pascal abc net : кортежи. Пример программы для поиска числа Фибоначчи

Ряд Фибоначчи

Вывести на экран столько элементов ряда Фибоначчи, сколько указал пользователь. Например, если на ввод поступило число 6, то вывод должен содержать шесть первых чисел ряда Фибоначчи: 1 2 3 5 8 13.

Ряд Фибоначчи — это последовательность натуральных чисел, где каждое последующее число является суммой двух предыдущих:
1 1 2 3 5 8 13 21 34 55 89 …

В программах ниже первые два элемента ряда равны не по 1 каждый, а 1 и 2.

Поскольку начальные значения должны быть заданы и выведены на экран, то первые два элемента ряда Фибоначчи выводятся перед циклом. Поэтому цикл начинается с третьего элемента ряда. В самом цикле выполняются следующие действия:

  1. Вывести сумму текущих значений последних двух элементов.
  2. Присвоить предпоследнему элементу значение последнего, а последнему сумму последнего и предпоследнего (это делается через буферную переменную).

Цикл выполняется до тех пор, пока переменная-счетчик, изначально равная 3, не достигнет числа, введенного пользователем.

Pascal


числа фибоначчи паскаль

var f1,f2,b,i,n: word;
begin
readln(n);
f1 := 1;
f2 := 2;
write(f1,’ ‘,f2,’ ‘);
for i:=3 to n do begin
write(f1+f2, ‘ ‘);
b := f1;
f1 := f2;
f2 := b + f1;
end;
writeln;
end.

9
1 2 3 5 8 13 21 34 55

Язык Си

#include

main() unsigned int n,i,f1,f2,b;
scanf(«%d»,
f1 = 1;
f2 = 2;
printf(«%d %d «,f1,f2);
for (i=3; i <=n; i++) printf(«%d «, f1+f2);
b = f1;
f1 = f2;
f2 = b + f1;
>
printf(«n»);
>

16
1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

Python

числа фибоначчи python (питон)

n = int(input())
f1 = 1
f2 = 2
print(f1, f2, end=» «)
for i in range(3,n+1):
print(f1+f2, end=» «)
b = f1
f1 = f2
f2 = b+f1
print()

12
1 2 3 5 8 13 21 34 55 89 144 233

КуМир

алг ряд Фибоначчи
нач
цел f1,f2,b,i,n
ввод n
f1 := 1
f2 := 2
если n >= 2 то вывод f1,» «,f2,» » все
нц для i от 3 до n
вывод f1+f2, » »
b := f1
f1 := f2
f2 := f2+b
кц
кон

10
1 2 3 5 8 13 21 34 55 89

Basic-256

input n
f1 = 1
f2 = 2
print f1 + » «;
print f2 + » «;
for i=3 to n
print (f1+f2) + » «;
b = f1
f1 = f2
f2 = f2+b
next i

Читайте также:
Как пользоваться программой синонимайзер

6
1 2 3 5 8 13

Источник: gospodaretsva.com

Вывести на экран n-ное число Фибоначчи

Формулировка. Дано натуральное n (которое также может быть равно 0). Вывести на экран n-ное число Фибоначчи.

Примечание: последовательность чисел Фибоначчи задается следующей рекуррентной формулой:

pascal46

То есть, нулевой член последовательности – это число 0, 1-й член – число 1, а любой другой член, начиная со 2-го, является суммой двух предыдущих. Например, F2 = F1 + F0 = 1 + 0 = 1, F3 = F2 + F1 = 1 + 1 = 2 и т. д.

Решение. Найдем несколько первых чисел Фибоначчи:

Легко заметить, что при их последовательном вычислении нам не нужно «расписывать» слагаемые по определению, и чтобы получить очередной член последовательности, достаточно на каждом шаге складывать два предыдущих полученных результата.

Так как нулевой и первый члены последовательности не вычисляются и даются как часть определения, будем полагать их заранее известными. Обозначим их идентификаторами fib0 и fib1. По примеру нахождения первых членов последовательности посчитаем количество операций, необходимое для вычисления каждого члена (считая, что предыдущие члены неизвестны). Легко увидеть, что для вычисления 2-го члена (при известном 1-ом и нулевом членах) необходима одна операция сложения, 3-го – две операции сложения и т. д. Видно, что по этим же правилам для вычисления n-ного члена необходимо выполнить (n – 1) операций.

Теперь можно начать писать программу. Сначала нам необходимо ввести значение n и выполнить инициализацию значений нулевого и первого чисел Фибоначчи, так как мы считаем их заранее известными:

Далее нам необходимо организовать цикл, в котором на каждом шаге переменные fib0 и fib1 будут получать следующие значения в последовательности чисел Фибоначчи. То есть, например, если в fib0 и fib1 будут находиться значения, соответственно, (n – 2)-го и (n – 1)-го членов последовательности Фибоначчи, то после одного шага цикла они будут содержать значения (n – 1)-го и n-го членов. Для этого можно создать некую вспомогательную переменную fib, в которую поместить результат сложения fib0 и fib1, после чего в fib0 у нас будет значение (n – 2)-го члена, в fib1 – (n – 1)-го, а в fib– n-го. Теперь нужно только скопировать значение fib1 в fib0 и fib в fib1, после чего значение переменной fib на этом шаге уже не имеет значения. С учетом того, что мы уже посчитали необходимое количество повторений для получения необходимого результата, цикл будет выглядеть так:

for i := 1 to n — 1 do begin

fib := fib1 + fib0;

Такой метод решения общей задачи, основанный на использовании в ней решений задач с меньшей размерностью исходных данных (в данном случае под размерностью понимается величина n), называется динамическим программированием.

Если говорить конкретнее, то мы применили метод восходящего динамического программирования, основывающийся на решении задач сначала минимальной размерности с постепенным получением решений более обширных задач. Этот метод наиболее оптимален в плане реализации, быстродействия и используемой памяти.

Читайте также:
Какие программы есть для открытия бизнеса

Однако далеко не для всех задач, решаемых с помощью динамического программирования, можно выяснить, решения каких подзадач потребуются для решения данной. Для этого существует метод нисходящего динамического программирования, с которым мы познакомимся позже.

Другой пример нисходящего динамического программирования – вычисление факториала (задача 28). Чтобы вычислить n!, необходим вычисленный (n – 1)! и т. д.

Итак, вернемся к текущей задаче. Ранее было сказано, что по исчерпании n – 1 шагов цикла в переменной fib1, которая пойдет на вывод в программе, будет храниться значение Fn. Проверим корректность обработки граничных значений (в частности, когда n = 0, 1, 2):

1) При n = 0 границы цикла будут в отрезке [1, 0 – 1]. При этом значение правой границы зависит от типа переменной i, так как компилятор, дабы избежать ошибок, при вычислении «расширяет» тип выражений, означающих границы цикла.

Если i будет объявлено типа byte, то выражение 0 – 1 даст в результате 255 (так как все числовые типы в языкеPascal большинство компиляторов считает кольцевыми), что вызовет длинную цепочку вычислений, а это неверно. Конечно, можно объявить i типа integer, и тогда границы цикла будут в отрезке [1, –1] и вход не будет осуществлен, но мы поступим иначе, стараясь сохранить память для переменных.

Так как при вычислении важно лишь количество повторений, мы можем сдвинуть отрезок [1, n – 1] на одну позицию правее на числовой прямой, и тогда цикл будет проходить от 2 до n, что поможет отсеять вход в цикл при вводе 0 в качестве n, так как невозможен цикл по всем i от 2 до 0.

Однако тогда мы столкнемся с другой проблемой: при вводе 0 будет выведено значение fib1, которой было присвоено число 1 при инициализации. Справиться с проблемой можно, присвоив fib1 значение 0, если n = 0:

if n = 0 then fib1 := 0;

2) При n = 1 (с учетом принятых в предыдущем пункте изменений) входа в цикл не будет, и на экран выведется неизменное значение fib1, равное 1;

3) При n = 2 произойдет вход в цикл, где i будет изменяться от 2 до 2 (то есть, в этом случае будет выполнен единственный шаг), в котором будет вычислено значение fib = fib1 + fib0 = 1 + 0 = 1, которое будет скопировано вfib1 и выведено на экран. Нетрудно понять, что дальнейшая подстановка значений не требуется, так как корректность циклической конструкции мы уже доказали.

Верхние значения мы не проверяем, так как не существует наибольшего номера в последовательности чисел Фибоначчи (хотя понятно, что корректность вычислений ограничена «вместимостью» типа integer, и при его превышении в вычислениях числа уже будут неправильными).

Код:

  1. program FibonacciNumbers;
  2. var
  3. fib0, fib1, fib: integer;
  4. i, n: byte;
  5. begin
  6. readln(n);
  7. fib0 := 0;
  8. fib1 := 1;
  9. for i := 2 to n do begin
  10. fib := fib1 + fib0;
  11. fib0 := fib1;
  12. fib1 := fib
  13. end;
  14. if n = 0 then fib1 := 0;
  15. writeln(fib1)
  16. end.

Источник: pascalzadachi.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru