Числа Фибоначчи: циклом и рекурсией
Числа Фибоначчи – это ряд чисел, в котором каждое следующее число равно сумме двух предыдущих: 1, 1, 2, 3, 5, 8, 13, ... . Иногда ряд начинают с нуля: 0, 1, 1, 2, 3, 5, ... . В данном случае мы будем придерживаться первого варианта.
Формула:
F1 = 1
F2 = 1
Fn = Fn-1 + Fn-2
Пример вычисления:
F3 = F2 + F1 = 1 + 1 = 2
F4 = F3 + F2 = 2 + 1 = 3
F5 = F4 + F3 = 3 + 2 = 5
F6 = F5 + F4 = 5 + 3 = 8
...
Вычисление n-го числа ряда Фибоначчи с цикла while
Присвоить переменным fib1 и fib2 значения двух первых элементов ряда, то есть присвоить переменным единицы.
Запросить у пользователя номер элемента, значение которого он хочет получить. Присвоить номер переменной n.
Выполнять следующие действия n - 2 раз, так как первые два элемента уже учтены:
Сложить fib1 и fib2, присвоив результат переменной для временного хранения данных, например, fib_sum.
Переменной fib1 присвоить значение fib2.
Переменной fib2 присвоить значение fib_sum.
Вывести на экран значение fib2.
Примечание. Если пользователь вводит 1 или 2, тело цикла ни разу не выполняется, на экран выводится исходное значение fib2.
fib1 = 1
fib2 = 1
n = input("Номер элемента ряда Фибоначчи: ")
n = int(n)
i = 0
while i < n - 2:
fib_sum = fib1 + fib2
fib1 = fib2
fib2 = fib_sum
i = i + 1
print(fib2)
Компактный вариант кода:
fib1 = fib2 = 1
n = int(input("Номер элемента ряда Фибоначчи: ")) - 2
while n > 0:
fib1, fib2 = fib2, fib1 + fib2
n -= 1
print(fib2)
Вывод чисел Фибоначчи циклом for
В данном случае выводится не только значение искомого элемента ряда Фибоначчи, но и все числа до него включительно. Для этого вывод значения fib2 помещен в цикл.
fib1 = fib2 = 1
n = int(input())
if n < 2:
quit()
print(fib1, end=' ')
print(fib2, end=' ')
for i in range(2, n):
fib1, fib2 = fib2, fib1 + fib2
print(fib2, end=' ')
print()
Пример выполнения:
10
1 1 2 3 5 8 13 21 34 55
Рекурсивное вычисление n-го числа ряда Фибоначчи
Если n = 1 или n = 2, вернуть в вызывающую ветку единицу, так как первый и второй элементы ряда Фибоначчи равны единице.
Во всех остальных случаях вызвать эту же функцию с аргументами n - 1 и n - 2. Результат двух вызовов сложить и вернуть в вызывающую ветку программы.
def fibonacci(n):
if n in (1, 2):
return 1
return fibonacci(n - 1) + fibonacci(n - 2)
print(fibonacci(10))
Допустим, n = 4. Тогда произойдет рекурсивный вызов fibonacci(3) и fibonacci(2). Второй вернет единицу, а первый приведет к еще двум вызовам функции: fibonacci(2) и fibonacci(1). Оба вызова вернут единицу, в сумме будет два. Таким образом, вызов fibonacci(3) возвращает число 2, которое суммируется с числом 1 от вызова fibonacci(2). Результат 3 возвращается в основную ветку программы. Четвертый элемент ряда Фибоначчи равен трем: 1 1 2 3.
Объяснение:
1)
var
a, b, s : real;
begin
read (a, b);
s := a * b;
write (s:10:4);
end.
2)
var
a, b, c, k : integer;
begin
read (a, b, c);
k := 0;
if a > 0 then inc (k);
if b > 0 then inc (k);
if c > 0 then inc (k);
writeln (k);
end.
3)
var
a : integer;
begin
read (a);
writeln ((a mod 10) * (a mod 100 div 10) * (a div 100 mod 10) * (a div 1000));
end.
4)
var
c, n : integer;
begin
read (n);
c := 0;
repeat
inc (c);
n := n div 10;
until n = 0;
writeln (c);
end.
5)
var
n, sum, i : integer;
begin
read (n);
sum := 0;
for i := 1 to n do
sum := sum + i;
writeln (sum);
end.
6)
var
d, n, k : integer;
begin
read (n, k);
d := 0;
while n >= k do
begin
d := d + 1;
n := n - k;
end;
writeln ('n div k = ', d);
writeln ('n mod k = ', n);
end.
7)
var
n, sum, i, tmp : integer;
begin
read (n);
sum := 0;
for i := 1 to n do
begin
read (tmp);
sum := sum + tmp;
end;
writeln (sum / n);
end.
8)
var
i, n, s : integer;
a : array [1..1000] of integer;
begin
s := 2;
read (n);
for i := 1 to n do
begin
a[i] := s;
s := s + 2 * i + 1;
end;
for i := 1 to n do write (a[i], ' ');
end.
9)
var
n, i, count, tmp : integer;
begin
read (n);
count := 0;
for i := 1 to n do
begin
read (tmp);
if tmp < 0 then inc (count);
end;
writeln (count);
end.
10)
var
n, i, j : integer;
begin
read (n);
for i := 1 to n do
begin
for j := 1 to i do
write ('*');
writeln;
end;
end.
11) //Не понял, как заполняется массив? Тут рандом
var
a : array [1..1000] of integer;
i, n : integer;
begin
read (n);
for i := 1 to n do
a[i] := trunc (random (1000)) - 500;
for i := 1 to n do
if a[i] > 0 then a[i] := a[i] * (-1)
else if a[i] < 0 then a[i] := sqr (a[i]);
for i := 1 to n do
write (a[i], ' ');
end.
12)
var
n, i, count : integer;
begin
read (n);
count := 0;
for i := 1 to n do
if n mod i = 0 then inc (count);
writeln (count);
end.