Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
0 / 0 / 0
Регистрация: 22.11.2017
Сообщений: 10
1

Числа Фиббоначи, рекурсия с условием

22.11.2017, 21:27. Показов 1246. Ответов 2
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем привет, уже три дня ломаю голову над такой задачкой, помогите пожалуйста...

"Проверьте, может ли число S быть суммой некоторого числа первых членов последовательности Фибоначчи."

Я сделала вот так...

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
function fib(n:integer):integer;
begin
  if (n=1) or (n=2) then
    fib := 1
  else fib := fib(n-1) + fib(n-2);
end;
 
function check_fib(a : integer):boolean;
var n, sum : integer;
begin
  n := 1;
  sum := 0;
  while sum < a do begin
    sum := sum + fib(n);
    n := n + 1;
  end;
  check_fib := sum - a=0;   
end;
 
var
  s, i : integer;
begin
  readln(s);
  writeln(check_fib(s));
end.
Мой вариант рабочий, но в нём происходит очень много рекурсий и поэтому он не эффективный, помогите пожалуйста его оптимизировать
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.11.2017, 21:27
Ответы с готовыми решениями:

Вывести числа последовательности Фиббоначи, которые меньше заданного числа ( рекурсия)
Здравствуйте! Столкнулся с проблемой вывода чисел последовательности Фиббоначи, которые меньше...

Числа Фиббоначи
Найти значимость N чисел ряда Фибоначчи. В этом ряде два члены имеют значение 1, а каждый следующий...

Числа Фиббоначи
Дано натуральное k. Напечатать k-ю цифру последовательности 1123581321..., в которой выписаны...

Задачка на числа Фиббоначи
Ребят, задача такая Числа Фибоначчи u(0), u(1), ... получили название в честь итальянского...

2
Платежеспособный зверь
8926 / 4354 / 1642
Регистрация: 28.10.2009
Сообщений: 11,568
23.11.2017, 01:25 2
Вот так можно:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var
a:array[1..10000]of longint;
i,s,rez:integer;
begin
readln(s);
a[1]:=1;
a[2]:=1;
rez:=0;
i:=0;
while rez<s do
begin
inc(i);
if i>2 then a[i]:=a[i-1]+a[i-2];
rez:=rez+a[i];
end;
if rez=s then writeln('yes')else writeln('no');
end.
А можно и без массива, меняя значения чисел Фибоначчи для вычисления очередного числа.
0
Модератор
9869 / 5237 / 3306
Регистрация: 17.08.2012
Сообщений: 16,006
23.11.2017, 12:32 3
Цитата Сообщение от кот Бегемот Посмотреть сообщение
Pascal
2
a:array[1..10000]of longint;
Оптимистично. В longint помещаются числа Фибоначчи до 46 включительно. А сумма - до 44 включительно. Сумму можно и не находить, поскольку

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
\sum_{i=1}^{n}F_i\,=\,F_{n+2}\,-\,1<br />

Для вычисления числа Фибоначчи можно отвести две переменные, а не три, пользуясь тем, что

https://www.cyberforum.ru/cgi-bin/latex.cgi?<br />
F_i\,=\,F_{i-1}\,+\,F_{i-2};\ \ \ F_{i-1}\,=\,F_i\,-\,F_{i-2}<br />

Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var n, f, t: longint;
begin
  write('n = ');
  readln(n);
  t := 1; //F[2];
  f := 2; //F[3];
  while f <= n do
    begin
      f := f + t;
      t := f - t
    end;
  writeln(n, ' is sum of Fibonacci sequence: ', f - 1 = n);
  readln
end.
Если ввести n, большее чем F46+2=1836311905, то в программе возникнет переполнение. При необходимости можно ввод n дополнить соответствующей проверкой.

Можно также применить формулу Бине, но для этой задачи это, по-моему, лишнее.

Ещё известно, что число, например, k, является чилом Фибоначчи тогда и только тогда, когда одно из чисел 5k2+4 или 5k2-4 является полным квадратом. То есть, в принципе, достаточно проверить, является ли целым числом корень квадратный из 5(n+1)2+4 или из 5(n+1)2-4, и всё. Циклы и рекурсия в этом случае, естественно, не требуются. Только вот число, которое можно проверить, для типа longint будет не более 20724. Такое ограничение, по-моему, является слишком большой платой за простоту вычислений. Если применить более ёмкие типы данных, или длинную арифметику, то, возможно, об этом ограничении можно будет забыть.
1
23.11.2017, 12:32
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.11.2017, 12:32
Помогаю со студенческими работами здесь

Определение К-го числа последовательности Фиббоначи
Помогите написать программу (паскаль ИЛИ С++) реализующую определение К-го числа последовательности...

Числа Фиббоначи через динамический массив
Среди первых N-чисел Фибоначчи найти такие, которые начинаются или заканчиваются на М....

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

Определить функцию для вычисления N-го числа Фиббоначи
Дано: натуральное число N. Требуется: определить функцию для вычисления N-го числа Фиббоначи...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru