Решение 16 задания егэ по информатике 2022 на питоне

Шестнадцатое задание из ЕГЭ по информатике 2022 даётся на рекурсию.

Это задание нужно делать с помощью компьютера.

В программировании рекурсией называется процесс, когда функция вызывает сама себя или, когда две функции попарно вызывают друг друга.

Мы будем писать все программы на языке программирования Python.

Что такое Функция в языке программирования Python ?

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

Рассмотрим пример функции, которая суммирует два числа!

def F(x, y):
    s = x + y
    return s

a = int(input())
b = int(input())

r = F(a, b)

print(r)

Здесь функция F, которая суммирует два числа.

В главной части программы запрашиваются два числа с клавиатуры: a и b! Эти два числа передаются в функцию F. В функции эти числа кладутся в локальные переменные x и y. Сумма переменных x и y записывается в переменную s. Переменная s возвращается, как результат работы функции F.

Результат работы функции будет помещён в переменную r (в строке r = F(a, b)) в основной части программы.

Таким образом, в переменной r будет сумма двух переменных a и b.

Функции позволяют сократить программный код для однотипных расчётов.

Тренировочные задачи 16 задания из ЕГЭ по информатике 2023

Задача (Стандартная)

Алгоритм вычисления значения функции F(n), где n – натуральное число,
задан следующими соотношениями:

F(n) = 1 при n = 1;
F(n) = n + F(n − 1), если n – чётно,
F(n) = 3 × F(n − 2), если n > 1 и при этом n – нечётно.

Чему равно значение функции F(25)?

Решение:

Напишем программу для решения данной задачи. В начале опишем все правила, которые даны в условии задачи для функции. В основной части программы запустим эту функцию.

# Сама функция
def F(n):
    if n==1: return 1
    if n%2==0: return n+F(n-1)
    if n>1 and n%2!=0: return 3*F(n-2)
    
# Основная часть программы
print(F(25))

После запуска рекурсивной функции программа выведет ответ 531441.

Выражение n%2 != 0 (остаток от деления на «2» не равен нулю) обозначает нечётное число. Выражение n%2==0 обозначает чётное число.

Ответ: 531441

Продолжаем тренировку по подготовке к 16 заданию ЕГЭ по информатике 2022.

Задача (Продолжаем подготовку)

Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:

F(1) = 1
F(2) = 3
F(n) = F(n–1) * n + F(n–2) * (n – 1) , при n > 2

Чему равно значение функции F(8)? В ответе запишите только натуральное число.

Решение:

# Сама функция
def F(n):
    if n==1: return 1
    if n==2: return 3
    if n>2: return F(n-1)*n + F(n-2)*(n-1)
    
# Основная часть программы
print(F(8))

Ответ получается 148329.

Ответ: 148329

Закрепляющий пример на рекурсию 16 задания из ЕГЭ по информатике 2022.

Задача(Две функции)

Алгоритм вычисления значения функций F(n) и G(n), где n — натуральное число, задан следующими соотношениями:


F(n) = 0, если n <= 2,
F(n) = G(n — 2), если n > 2


G(n) = 0, n <= 1,
G(n) = F(n — 1) + n, если n > 1

Чему равно значение функции F(8)? В ответе запишите только натуральное число.

Решение:

# Сами функции
def F(n):
    if n<=2: return 0
    if n>2: return G(n-2)

def G(n):
    if n<=1: return 0
    if n>1: return F(n-1)+n

# Основная часть программы
print(F(8))

Получается ответ 9.

Ответ: 9

Задача (Количество значений)

Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:

F(n) = 2*n*n*n + 1, при n > 25
F(n) = F(n+2) + 2*F(n+3), при n ≤ 25

Определите количество натуральных значений n из отрезка [1; 1000], для которых значение F(n) кратно 11.

Решение:

# Сама функция
def F(n):
    if n>25: return 2*n*n*n + 1
    if n<=25: return F(n+2) + 2*F(n+3)

k=0

# Перебираем диапазон
for i in range(1, 1001):
    if F(i)%11==0:
        k=k+1

print(k)

В начале формируем функцию F. Затем перебираем числа из диапазона от 1 до 1000. Каждое число подставляем в функцию F. Если значение функции F делится на 11, то мы зачитываем такое значение i.

В ответе получается 91.

Ответ: 91

Задача (Используем глобальную переменную)
ЕГЭ по информатике - задание 16 (Глобальная переменная)

Решение:

При решении этой задачи можно применить глобальную переменную.

def F(n):
    global s
    s=s+1
    if n>=1:
        s=s+1
        F(n-1)
        F(n-2)
        s=s+1

s=0
F(35)
print(s)

Здесь внутри функции заводим глобальную переменную s, которая будет подсчитывать количество напечатанных звёздочек. Теперь эту переменную видно при любом вызове функции, и при каждом вызове функции она будет одна и та же переменная. Вместо печати звёздочек пишем конструкцию s=s+1.

В основной части программы перед первым запуском функции переменной s присваиваем 0.

Программа может немного медленно работать из-за большой глубины рекурсии, но через минуту выведет число 96631265.

Ответ: 96631265

Новые тенденции

В последнее время мы видим тенденцию в 16 задании из ЕГЭ по информатике 2023, что теперь мало переписать функцию и её запустить. Необходимо подумать, как можно преобразовать то рекурсивное выражение, которое нужно вычислить.

Задача (Новое веяние)

(К. Багдасарян) Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:

F(n) = 2, если n = 1,
F(n) = 2 · F(n – 1), если n > 1.

Чему равно значение выражения F(1900)/21890 ?

Решение:

1 Способ (Аналитическое решение)

Если мы просто перепишем функцию и попытаемся вычислить выражение F(1900)/21890, то получим ошибку RecursionError: maximum recursion depth exceeded. Возникает она из-за слишком большой цепочки вызовов функции.

В подобных задачах нужно попытаться самому упростить выражение, которое пытаемся вычислить. Посмотрим, что из себя представляет функция.

F(1900) = 2*F(1899) = 2*2*F(1898) = … 21900

Тогда

F(1900)/21890 = 21900/21890 = 210 = 1024

Получается 1024.

2 Способ (Через lru_cache)

Чтобы уменьшить цепочку вызовов функции, можно использовать инструмент lru_cache.

from functools import lru_cache

@lru_cache(None)
def F(n):
    if n==1: return 2
    if n>1: return 2*F(n-1)

for i in range(2, 1900):
    F(i)

print(F(1900)/2**1890)

В задаче функция опирается на значение функции от n-1 и т.д. За счёт этого происходят длинные вычисления для каждого числа n.

Использовав инструмент lru_cache, мы пробегаемся в цикле по значениям n в возрастающем порядке, и для каждого значения сохраняем результаты функции. Таким образом, вычисляя очередное значение, программа опирается на уже готовый результат, тем самым цепочка вызовов функции будет маленькой.

Ответ: 1024

Задача(Новое веяние, закрепление)

Алгоритм вычисления значения функции F(n), где n — натуральное число, задан следующими соотношениями:

F(n) = 1 при n ≤ 2;
F(n) = n * F(n-2), если n > 2.

Чему равно значение выражение F(3000)/F(2996) ?

Решение:

1 Способ (Аналитическое решение)

Начнём расписывать F(3000).

F(3000) = 3000*F(2998) = 3000*2998*F(2996)

Получается:

F(3000)/F(2996) = 3000*2998*F(2996)/F(2996) = 3000*2998 = 8994000

2 Способ (Через lru_cache)

from functools import lru_cache

@lru_cache(None)
def F(n):
    if n<=2: return 1
    if n>2: return n*F(n-2)

for i in range(2, 3000):
    F(i)

print(F(3000)/F(2996))

Ответ: 8994000

Задача (Вперёд к победе!)

Алгоритм вычисления значения функции F(n), где n — натуральное число, задан следующими соотношениями:

F(n) = 1 при n=1;
F(n) = 2 при n=2;
F(n) = n*(n-1) + F(n-1) + F(n-2), если n > 2.

Чему равно значение функции F(2023) — F(2021) — 2*F(2020) — F(2019)?

Решение:

1 Способ (Аналитическое решение)

F(2023) = 2023*2022 + F(2022) + F(2021) =
= 2023*2022 + 2022*2021 + F(2021) + F(2020) + F(2021) =
=2023*2022 + 2022*2021 + 2021*2020 + F(2020) + F(2019) + F(2020) + F(2021) =
2023*2022 + 2022*2021 + 2021*2020 + 2*F(2020) + F(2019) + F(2021) =
2023*2022 + 2022*2021 + 2021*2020 + F(2021) + 2*F(2020) + F(2019)

Если подставим полученный результат в выражение, которое нужно найти, то получим:

2023*2022 + 2022*2021 + 2021*2020 = 12259388

2 Способ (Через lru_cache)

from functools import lru_cache

@lru_cache(None)
def F(n):
    if n==1: return 1
    if n==2: return 2
    if n>2: return n*(n-1) + F(n-1) + F(n-2)

for i in range(2, 2023):
    F(i)

print(F(2023) - F(2021) -2*F(2020) - F(2019))

Ответ: 12259388

Удачи при решении 16 задания из ЕГЭ по информатике 2022.

А если промежуток намного больше будет? например не [1, 1000], а [1,500 000 000]? пк зависнет просто.. можно кроме как разбивать промежуток много на разных программ решить такую задачу?

Ниже на пяти языках программирования записан рекурсивный алгоритм F.
def F(n):
  print(n)
  if n > 0:
  F(n — 1)
  F(n — 3)
Чему равна сумма всех чисел, напечатанных на экране при выполнении вызова F(5)?
А можете показать как это через python решать ?

На уроке рассматривается решение 16 задания ЕГЭ по информатике про рекурсивные алгоритмы

Рекомендации по выполнению:

«Для успешного выполнения этого задания следует аккуратно произвести трассировку
предложенной рекурсивной функции»

Типичные ошибки и рекомендации по их предотвращению:

«Крайне важно отслеживать правильность возврата выполнения программы в нужную точку для
каждого рекурсивного вызова»

ФГБНУ «Федеральный институт педагогических измерений»

Для начала, разберем некоторые определения.

  • Процедура (функция)– это вспомогательный алгоритм (фрагмент кода программы), который служит для выполнения определенных действий.
  • Предназначена для:

  • выполнения одинаковых действий в различных местах одной и той же программы;
  • разбивки программы (или другой процедуры или функции) на подзадачи для улучшения читаемости кода;
  • Особенности программирования процедур (функций):

  • подпрограммы располагаются всегда выше основной программы:
  • процедура

  • сначала составляется заголовок процедуры или функции, в котором перечисляются формальные параметры, они обозначаются идентификаторами, как переменные (т.к. формальные параметры могут меняться, также как переменные):
  • var x,y:integer;
    { заголовок процедуры 
    с формальными переменными x и y:}
    procedure Sum(x,y:integer); 
    begin
     ...
    end;
    // основная программа
    begin
      ...
    end.
    var x,y:integer;
    { заголовок функции 
    с формальными переменными x и y:}
    function Sum(x,y:integer): integer; 
    begin
      ...
    end;
    // основная программа
    begin
     ...
    end.
  • в месте вызова процедуры в круглых скобках указываются фактические параметры (числовые значения либо арифметические выражения) в том же порядке:
  • вызов процедуры

  • функция вызывается немного иначе:
  • { заголовок процедуры 
    с формальными переменными x и y:}
    procedure Sum(x,y:integer); 
    begin
     ...
    end;
    // основная программа
    begin
      Sum(100,200)
    end.
    { заголовок функции 
    с формальными переменными x и y:}
    function Sum(x,y:integer): integer; 
    begin
      ...
    end;
    // основная программа
    begin
     write (Sum(100,200))
    end.
  • компилятор не будет выполнять процедуру (функцию) до момента ее вызова в основной программе;
  • пример работы процедуры и функции для сложения двух значений (порядок действий компилятора указан числами):
  • var x,y:integer;
    procedure Sum(x,y:integer); 
    begin
    //3. Выводим сумму двух запрошенных чисел
      write(x+y); 
    end;
    begin
    // 1. запрашиваем два числа
     readln(x,y);
    // 2. передаем запрошенные числа в процедуру 
     Sum(x,y)  
    end.
    var x,y:integer;
    function Sum(x,y:integer): integer; 
    begin
    {3. Суммируем два числа и присваиваем 
    значение функции:}
      Sum:=x+y;
    end;
    begin
    // 1. запрашиваем два числа
     readln(x,y);
    {2. передаем запрошенные числа 
    в функцию и выводим результат:} 
     write (Sum(x,y))
    end.

    Подробное описание работы с процедурами можно найти, перейдя по ссылке.

  • Рекурсивной называется процедура, вызывающая сама себя:
  • procedure row(n:integer);
    begin
         if n >=1 then begin
            write (n, ' ');
            row(n-1)
         end;
    end;
    begin
        row(10);
    end.

    Для использования рекурсии, необходимо задать:

    • условие остановки рекурсии (обычно, в виде условного оператора):
    • рекуррентную формулу (обычно, вызов самой себя с измененным параметром):

    Подробное описание работы с рекурсивными процедурами и функциями в Паскале можно найти здесь.

    Плейлист видеоразборов задания на YouTube:
    Задание демонстрационного варианта 2022 года ФИПИ


    Решение по рекуррентной формуле

    16_13:

    Алгоритм вычисления значений функций F(n) и G(n), где n – натуральное число, задан следующими соотношениями:

    F(1) = 1; G(1) = 1;
    F(n) = F(n–1) + 3·G(n–1), при n >=2 
    G(n) = F(n–1) - 2·G(n–1), при n >=2
    

    Чему равна сумма цифр значения F(18)?

    ✍ Решение:

    ✎ Решение с использованием программирования:

    PascalABC.NET:

    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
    26
    27
    28
    29
    30
    31
    
    function F(n: integer): integer; forward;
    function G(n: integer): integer; forward;
     
    function F(n: integer): integer;
    begin
      if n = 1 then
        F := 1  // или result := 1
      else if n >= 2 then
        F := F(n - 1) + 3 * G(n - 1) 
        // или result := F(n - 1) + 3 * G(n - 1)
    end;
     
    function G(n: integer): integer;
    begin
      if n = 1 then
        G := 1  // или result := 1
      else if n >= 2 then
        G := F(n - 1) - 2 * G(n - 1)
        // или result := F(n - 1) - 2 * G(n - 1)
    end;
     
    begin
      var res := F(18);
      var s := 0;
      while res > 0 do
      begin
        s := s + (res mod 10);
        res := res div 10;
      end;
      print(s)
    end.

    Питон:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    def F( n ):
        if n == 1: 
            return 1
        elif (n >= 2):
            return F(n-1)+3*G(n-1)
    def G( n ):
        if n == 1: 
            return 1
        elif (n >= 2):
            return F(n-1)-2*G(n-1)
     
    res = F(18)
    s = 0
    while res > 0:
        s += res%10
        res = res // 10
    print(s)

    C++:

    Результат: 46


    16_1:

    Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:

    F(1) = 1
    F(n) = F(n–1) * (n + 2), при n > 1
    

    ✍ Решение:

    ✎ Решение с использованием программирования:

    PascalABC.NET (решение №1):

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    function F(n: integer): integer;
    begin
      if n = 1 then
        F := 1
      else if n > 1 then
        F := F(n - 1) * (n + 2)
    end;
     
    begin
      print(F(5))
    end.

    PascalABC.NET (решение №2):

    1
    2
    3
    4
    5
    6
    7
    
    function F(n:integer):integer:=
     n=1 ? 1
     :  F(n-1) * (n+2);
     
    begin
      print(F(5))
    end.

    Питон:

    1
    2
    3
    4
    5
    6
    
    def F( n ):
        if n == 1: 
            return 1
        elif (n > 1):
            return F(n-1)*(n+2)
    print (F(5))

    C++:

    ✎ Решение теоретическое (методом с конца к началу):

    • Из условия задания мы имеем рекуррентную формулу: F(n–1) * (n + 2) и условие остановки рекурсии: n > 1.
    • Поскольку рекуррентная формула уже задана, то остается подставить в нее начальный параметр — число 5:
    • F(5) = F(4) * 7
      
    • Теперь применим эту формулу для всех вызываемых вложенных функций, вплоть до F(1) (при котором «сработает» остановка рекурсии). Получим:
    • F(5) = F(4) * 7
             F(4) = F(3) * 6
                    F(3) = F(2) * 5
                           F(2) = F(1) * 4
                                    1
      
    • На F(2) необходимо остановиться, так как действует условие остановки рекурсии: формула работает для n > 1. Также учтем, что по условию F(1) = 1.
    • Теперь с конца к началу перепишем все получившиеся сомножители и перемножим их:
    • 1 * 4 * 5 * 6 * 7 = 840

    Результат: 840


    16_2:

    Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:

    F(0) = 1, F(1) = 1
    F(n) = 2 * F(n–1) + F(n-2), при n > 1
    

    Чему равно значение функции F(6)? В ответе запишите только целое число.

    ✍ Решение:

    ✎ Решение с использованием программирования:

    PascalABC.NET (решение №2):

    1
    2
    3
    4
    5
    6
    7
    8
    
    function F(n:integer):integer;
    begin
      if (n = 0) or (n = 1) then result:=1
      else if n>1 then result:=2*F(n-1) + F(n-2);
    end;
    begin
      print(F(6))
    end.

    ✎ Решение 1. Теоретическое (метод решения с начала к концу):

    • Из условия задания мы имеем рекуррентную формулу: 2 * F(n–1) + F(n-2) и условие остановки рекурсии: n > 1.
    • Из заданной рекуррентной формулы видим, что функция зависит от предыдущей функции (F(n–1)) и от пред-предыдущей функции (F(n-2)).
    • Так как первые два значения заданы (F(0) = 1, F(1) = 1), то можно построить таблицу последующих значений, двигаясь к числу 6:
    • n 0 1 2 3 4 5 6
      F(n)
      2*F(n – 1)+F(n — 2)
      1 1 2*1+1 =3 2*3+1 =7 2*7+3 =17 2*17+7 =41 2*41+17 =99
    • Таким образом, получаем, что при вызове функции F(6) результатом будет число 99

    ✎ Решение 2. Теоретическое (метод решения с конца к началу):

    • Поскольку рекуррентная формула уже задана, то остается подставить в нее начальный параметр — число 6:
    • F(6) = 2*F(5) + F(4)
      
    • Теперь применим эту формулу для всех вызываемых вложенных функций, вплоть до F(2) (F(1) и F(0) известны из условия задачи). Получим:
    • F(6) = 2*F(5) + F(4)
             F(5) = 2*F(4) + F(3)
                    F(4) = 2*F(3) + F(2)
                           F(3) = 2*F(2) + F(1)
                                    F(2) = 2*F(1) + F(0) = 2*1+1 = 3
                                              1       1
      
    • Теперь с конца к началу перепишем все получившиеся значения функций:
    • F(6) = 2*F(5) + F(4) = 2*41 + 17 = 99
             F(5) = 2*F(4) + F(3) + 2*17+7 = 41 
                    F(4) = 2*F(3) + F(2) = 2*7+3 = 17 
                           F(3) = 2*F(2) + F(1) = 2*3+1 = 7 
                                    F(2) = 2*F(1) + F(0) = 2*1+1 = 3   
                                              1       1
      

    Результат: 99

    Решение данного задания 16 также можно посмотреть в видеоуроке (теоретическое):

    📹 YouTube здесь


    16_10:

    Алгоритм вычисления значений функций F(n) и G(n), где n – натуральное число, задан следующими соотношениями:

    F(1) = 1; G(1) = 1;
    F(n) = F(n–1) – G(n–1), 
    G(n) = F(n–1) + 2*G(n–1), при n >= 2

    Чему равно значение величины F(5)/G(5)?
    В ответе запишите только целое число.

      
    Типовые задания для тренировки

    ✍ Решение:

    ✎ Решение с использованием программирования:

    PascalABC.NET:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    function F(n: integer): integer; forward;
    function G(n: integer): integer; forward;
     
    function F(n:integer):integer;
    begin
      if n = 1 then result:=1
      else if n>=2 then result:=F(n-1) - G(n-1);
    end;
     
    function G(n:integer):integer;
    begin
      if n = 1 then result:=1
      else if n>=2 then result:=F(n-1) + 2*G(n-1);
    end;
    begin
      print(F(5)/G(5))
    end.

    ✎ Решение теоретическое:

    • Решим задание с вызова функций F(5) и G(5). Будем получать формулы последовательно для F(5), F(4), …, F(1), G(5), G(4), …, G(1). Дойдя до известных значений F(1) = 1 и G(1) = 1, подставим их в полученные формулы:
    • F(5) = F(4) – G(4)
      G(5) = F(4) + 2*G(4)
      	F(4) = F(3) – G(3)  
      	G(4) = F(3) + 2*G(3) 
      		F(3) = F(2) – G(2) 
      		G(3) = F(2) + 2*G(2) 
      			F(2) = F(1) – G(1) 
      			G(2) = F(1) + 2*G(1) 
                                     F(1) = 1; G(1) = 1;
      
      F(2) = F(1) – G(1) = 1 - 1 = 0
      G(2) = F(1) + 2*G(1) = 1 + 2 = 3
      F(3) = F(2) – G(2) = 0 - 3 = -3
      G(3) = F(2) + 2*G(2) = 0 + 6 = 6
      F(4) = F(3) – G(3) = -3 - 6 = -9 
      G(4) = F(3) + 2*G(3) = -3 + 12 = 9
      F(5) = F(4) – G(4) = -9 - 9 = -18
      G(5) = F(4) + 2*G(4) = -9 + 18 = 9
      
    • Итого:
    • F(5)/G(5) = -18/9 = -2

    Ответ: -2


    Что вернет функция. Сколько символов «звездочка». Какова сумма чисел

    16_9:

    Что вернет функция F, если ее вызвать с аргументом 6?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    
    function f(a:word):longword;
    begin
      if a>0 then
        f := f(a-1)*a;
      else
        f:=1;
    end;
    Бейсик:

    FUNCTION F(a)
      IF a > 0 THEN
         F = F(a - 1) * a
      ELSE
         F = 1;
      END IF
    END FUNCTION
    Python:

    def F(a):
        if a > 0:
            return F(a - 1) * a
        else:
            return 1
    С++:

    int F(int a);
    int F(int a) {
      if (a > 0)
        return F(a - 1) * a;
      else
        return 1;
    }

    ✍ Решение:

      ✎ Решение с использованием программирования:
      Подобные задания потеряли смысл после введения компьютерного ЕГЭ. Решение очевидно и просто:
      PascalABC.NET:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      
      function f(a:word):longword;
      begin
        if a>0 then
          f := f(a-1)*a
        else
          f:=1;
      end;
      begin
        print(f(6))
      end.

      ✎ Решение теоретическое:
      Рассмотрим алгоритм функции:

    • Если аргумент функции, т.е. a, равен единице, то функция возвращает в программу значение 1, иначе вызывается функция с аргументом a — 1 и результат этой функции умножается на a.
    • Это рекурсивный алгоритм вычисления факториала числа. Чтобы удостовериться в этом, выполним трассировку функции с аргументом = 6:
    • F(6):
      6 > 0, то F(5)*6
      F(5):
      5 > 0, то F(4)*5
      F(4):
      4 > 0, то F(3)*4
      F(3):
      3 > 0, то F(2)*3
      F(2):
      2 > 0, то F(1)*2
      F(1): 
      1 > 0, то F(0)*1
      F(0):
      0 > 0 - нет, то F(0) = 1
      
      Теперь подставляем значения, двигаясь вверх по прописанному алгоритму:
      F(1)= F(0)*1 = 1*1 = 1
      F(2)= F(1)*2 = 1*2 = 2
      F(3)= F(2)*3 = 2*3 = 6
      F(4)= F(3)*4 = 6*4 = 24
      F(5)= F(4)*5 = 24*5 = 120
      F(6)= F(5)*6 = 120*6 = 720
      
    • Т.е. 6! = 720

    Ответ: 720


    16_3:

    Ниже записаны две рекурсивные функции (процедуры): F и G.
    Сколько символов «звездочка» будет напечатано на экране при выполнении вызова F(18)?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    procedure F(n: integer); forward;
    procedure G(n: integer); forward;
     
    procedure F(n: integer);
    begin
      write('*');
      if n > 10 then F(n - 2) else G(n);
    end;
     
    procedure G(n: integer);
    begin
      write('**');
      if n > 0 then F(n - 3);
    end;
    Бейсик:

    DECLARE SUB F(n)
    DECLARE SUB G(n)
    SUB F(n)
      PRINT "*"
      IF n > 10 THEN
         F(n - 2)
      ELSE
         G(n)
      END IF
    END SUB
    SUB G(n)
      PRINT "**"
      IF n > 0 THEN
         F(n - 3)
      END IF
    END SUB
    Python:

    def F(n):
      print("*")
      if n > 10:
        F(n - 2)
      else:
        G(n)
    def G(n):
      print("**")
      if n > 0:
        F(n - 3)
    С++:

    void F(int n) {
      std::cout << "*";
      if (n > 10) {
        F(n - 2);
      }
      else {
        G(n);
      }
    }
    void G(int n) {
      std::cout << "**";
      if (n > 0)
        F(n - 3);
    }

      
    Типовые задания для тренировки

    ✍ Решение:

      ✎ Решение с использованием программирования:
      Подобные задания потеряли смысл после введения компьютерного ЕГЭ. Однако, при большом количестве звездочек имеет смысл ввести счетчик для хранения кол-ва звезд:
      PascalABC.NET:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      
      procedure F(n: integer); forward;
      procedure G(n: integer); forward;
      var k:=0; // объявление глобальной переменной-счетчика 
      procedure F(n: integer);
      begin
        write('*');
        k+=1; // увеличение счетчика
        if n > 10 then F(n - 2) else G(n);
      end;
       
      procedure G(n: integer);
      begin
        write('**');
        k+=2;// увеличение счетчика
        if n > 0 then F(n - 3);
      end;
      begin
       f(18);
       print(k) // вывод счетчика
      end.

      ✎ Решение теоретическое:

    • Для удобства восприятия задания, выпишем рекуррентные формулы и условия остановки рекурсии для двух процедур:
    • Для F:
      *
      F(n - 2) при n > 10
      G(n) при n <= 10
      
      Для G:
      **
      F(n - 3) при n > 0
      

      ✎ Способ 1:

    • Выпишем последовательность вызовов процедур, начиная с указанного в задании F(18):
    • F(18) -> F(16) -> F(14) -> F(12) -> F(10) -> G(10) -> 
      F(7) -> G(7) -> F(4) -> G(4) -> F(1) -> G(1) -> F(-2) -> G(-2)
      
    • Обратим внимание, что независимо от условия процедура F выводит на экран одну *, а процедура G выводит две *. Посчитаем для последовательности вызовов итоговую сумму звездочек: 9F + 5G = 9*1 + 5*2 = 19
    • Результат: 19

      ✎ Способ 2:

    • Рассмотрим пошагово выполнение программы при вызове F(18):
    • 1 шаг: F(18)
             *    F(16)
      2 шаг:      *    F(14)
      3 шаг:           *    F(12)
      4 шаг:                *    F(10)
      5 шаг:                     *    G(10)
      6 шаг:                          **   F(7)
      7 шаг:                                *  G(7)
      8 шаг:                                   **  F(4)
      9 шаг:                                       *    G(4)
      10 шаг:                                           **   F(1)
      11 шаг:                                                *   G(1)
      12 шаг:                                                    **   F(-2)
      13 шаг:                                                         *   G(-2)
      14 шаг:                                                             **
      
    • Посчитаем количество звездочек: 19

    Результат: 19

    Пошаговое аналитическое решение данного 16 задания ЕГЭ по информатике доступно в видеоуроке:

    📹 YouTube здесь

    Видеорешение на RuTube здесь


    16_12:

    Сколько символов «звездочка» будет напечатано на экране при выполнении вызова F(5)?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    procedure F(n: integer);
    begin
     writeln('*');
     if n > 0 then begin
       F(n-2);
       F(n div 2);
       F(n div 2);
     end
    end;
    Бейсик:

    DECLARE SUB F(n)
    SUB F(n)
      PRINT '*'
      IF n > 0 THEN
         F(n - 2)
         F(n  2)
         F(n  2)
      END IF
    END SUB
    Python:

    def F(n):
      print('*')
      if n > 0:    
        F(n-2)
        F(n // 2)
        F(n // 2)
    С++:

    void F(int n) {
      std::cout <<*;
      if (n > 0) {
        F(n - 2);
        F(n / 2);
        F(n / 2);
      }
    }

    ✍ Решение:

    • В начале каждого вызова независимо от условия на экран выводится «звездочка». Кроме того, если условие n > 0 истинно, то функция вызывается еще три раза с разными аргументами. Таким образом, каждая функция выводит на экран либо одну звездочку (если условие ложно), либо 4 звездочки если условие истинно.
    • Схематично рассмотрим вызов каждой функции, начиная с функции F(5). Дойдя до F(0), для которой условие будет ложно, будем подставлять полученное количество «звездочек», двигаясь опять к F(5):
    • F(5) = одна '*', F(3), F(2), F(2)
      F(3) = одна '*', F(1), F(1), F(1)
      F(2) = одна '*', F(0), F(1), F(1)
      F(1) = одна '*', F(-1), F(0), F(0)
      F(0) = одна '*' = 1  (условие ложно)
      F(-1) = одна '*' = 1 (условие ложно)
      ---
      Движение обратно:
      F(1) = одна '*', F(-1), F(0), F(0) = 1 + 1 + 1 + 1 = 4 '*'
      F(2) = одна '*', F(0), F(1), F(1) = 1 + 1 + 4 + 4 = 10 '*'
      F(3) = одна '*', F(1), F(1), F(1) = 1 + 4 + 4 + 4 = 13 '*'
      F(5) = одна '*', F(3), F(2), F(2) = 1 + 13 + 10 + 10 = 34 '*' 
      

    Ответ: 34


    16_4:

    Ниже записаны две рекурсивные функции (процедуры): F и G.
    Какова сумма чисел, напечатанных на экране при выполнении вызова F(17)?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    procedure F(n: integer); forward;
    procedure G(n: integer); forward;
     
    procedure F(n: integer);
    begin
      writeln(n);
      if n mod 2  =0 then F(n div 2) 
      else G((n - 1) div 2);
    end;
     
    procedure G(n: integer);
    begin
      writeln (n); 
      if n > 0 then F(n);
    end;
    Бейсик:

    DECLARE SUB F(n)
    DECLARE SUB G(n)
    SUB F(n)
      PRINT n
      IF n MOD 2 = 0 THEN
         F(n  2)
      ELSE
         G ( (n - 1)  2)
      END IF
    END SUB
    SUB G(n)
      PRINT n
      IF n > 0 THEN
         F(n)
      END IF
    END SUB
    Python:

    def F(n):
      print(n)
      if n % 2 == 0:
        F(n // 2)
      else:
        G((n - 1) // 2)
    def G(n):
      print(n)
      if n > 0:
        F(n)
    С++:

    void F(int n) {
      std::cout << n << endl;
      if (n % 2 == 0) {
        F(n / 2);
      }
      else {
        G((n - 1) / 2) ;
      }
    }
    void G(int n) {
      std::cout << n << endl;
      if (n > 0)
        F(n);
    }

      
    Типовые задания для тренировки

    ✍ Решение:

      ✎ Решение с использованием программирования:
      Подобные задания потеряли смысл после введения компьютерного ЕГЭ. Однако, при большом количестве чисел имеет смысл ввести сумматор для вычисления суммы данных чисел:
      PascalABC.NET:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      
      procedure F(n: integer); forward;
      procedure G(n: integer); forward;
      var sum:=0; // сумматор
      procedure F(n: integer);
      begin
        writeln(n);
        sum+=n; // добавляем число в сумматор
        if n mod 2  =0 then F(n div 2) 
        else G((n - 1) div 2);
      end;
       
      procedure G(n: integer);
      begin
        writeln (n); 
        sum+=n; // добавляем число в сумматор
        if n > 0 then F(n);
      end;
      begin
        F(17);
        print('sum =',sum)
      end.

      ✎ Решение теоретическое:

    • Для удобства восприятия задания, выпишем рекуррентные формулы и условия остановки рекурсии для двух процедур:
    • Для F:
      n
      F(n div 2) при n - четное (n mod 2 = 0)
      G((n - 1) div 2) при n - нечетное
      
      Для G:
      n
      F(n) при n > 0
      
    • Выпишем последовательность вызовов процедур, начиная с указанного в задании F(17).
    • Обратим внимание, что независимо от условия как процедура F выводит на экран n, так и процедура G выводит n.
    • F(17) -> n - нечетное, G(8) вывод 17
      G(8) -> F(8)                вывод 8
      F(8) -> n - четное, F(4)    вывод 8
      F(4) -> n - четное, F(2)    вывод 4 
      F(2) -> n - четное, F(1)    вывод 2
      F(1) -> n - нечетное, G(0)  вывод 1
      G(0)                        вывод 0
      
    • Сумма:
    • 17 + 8 + 8 + 4 + 2 + 1 + 0 = 40

    Результат: 40


    16_5:

    Ниже записаны две рекурсивные функции (процедуры): F и G.
    Чему будет равно значение, вычисленное при выполнении вызова F(6)?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    
    function F(n: integer):integer; forward;
    function G(n: integer):integer; forward;
    function F(n:integer):integer;
    begin
     if (n > 2) then
       F:= F(n - 1) + G(n - 2)
     else F:= n;
    end;
    function G(n:integer):integer;
    begin
     if (n > 2)then
       G:= G(n - 1) + F(n -2)
     else G:= n+1;
    end;
    Бейсик:

    FUNCTION F(n)
      IF n > 2 THEN
         F = F(n - 1) + G(n - 2)
      ELSE
         F = n;
      END IF
    END FUNCTION 
    FUNCTION G(n)
      IF n > 2 THEN
         G = G(n - 1) + F(n -2)
      ELSE
         G = n+1;
      END IF
    END FUNCTION
    Python:

    def F(n):
        if n > 2:
            return F(n - 1) + G(n - 2)
        else:
            return n
    def G(n):
        if n > 2:
            return G(n - 1) + F(n - 2)
        else:
            return n+1
    С++:

    int F(int n);
    int G(int n);
    int F(int n) {
      if (n > 2)
        return F(n - 1) + G(n - 2);
      else
        return n;
    }
    int G(int n) {
      if (n > 2)
        return G(n - 1) + F(n - 2);
      else
        return n + 1;
    }

      
    Типовые задания для тренировки

    ✍ Решение:

    Результат: 17

    Предлагаем посмотреть видеоразбор данного аналитического решения:

    📹 YouTube здесь

    Видеорешение на RuTube здесь



    С каким аргументом?

    16_8:

    Вызов представленной ниже рекурсивной функции приводит к появлению на экране чисел и точек. С каким минимальным натуральным аргументом а нужно вызвать эту функцию, чтобы в результате на экране появилось 5 точек (не обязательно подряд, между точками могут встречаться числа)?

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    function gz(a:integer):integer;
    var p:integer;
    begin
      if a<1 then begin 
       gz:=1; exit; 
      end;
      if a mod 3=0 then begin
       write('...');
       p:=gz(a div 3)+gz(a div 4);
      end
      else begin
        write('.');
        p:=gz(a div 4);
      end;
      write(p);
      gz:=2; 
    end;

    ✍ Решение:

      ✎ Решение с использованием программирования:
      Подобные задания потеряли смысл после введения компьютерного ЕГЭ. Однако, при большом количестве чисел имеет смысл ввести сумматор для вычисления суммы данных чисел:
      PascalABC.NET:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      
      procedure F(n: integer); forward;
      procedure G(n: integer); forward;
      var sum:=0; // сумматор
      procedure F(n: integer);
      begin
        writeln(n);
        sum+=n; // добавляем число в сумматор
        if n mod 2  =0 then F(n div 2) 
        else G((n - 1) div 2);
      end;
       
      procedure G(n: integer);
      begin
        writeln (n); 
        sum+=n; // добавляем число в сумматор
        if n > 0 then F(n);
      end;
      begin
        F(17);
        print('sum =',sum)
      end.

    Результат: 6

    Смотрите подробное аналитическое решение:

    📹 YouTube здесь

    📹 Видеорешение на RuTube здесь (аналитическое)


    Не актуально для компьютерного ЕГЭ

    Все числа, которые будут напечатаны на экране, в том же порядке

    16_6: Демоверсия ЕГЭ 2018 информатика:

    Ниже на пяти языках программирования записан рекурсивный алгоритм F.
    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    procedure F(n: integer);
    begin
    if n > 0 then
    begin
      write(n);
      F(n - 3);
      F(n div 3)
    end
    end;
    Бейсик:

    SUB F(n)
      IF n > 0 THEN
         PRINT n
         F(n - 3)
         F(n  3)
      END IF
    END SUB
    Python:

    def F(n):
      if n > 0:
         print(n)
         F(n - 3)
         F(n // 3)
    С++:

    void F(int n){
      if (n > 0){
        std::cout <<n;
        F(n - 3);
        F(n / 3);
      }
    }

    Запишите подряд без пробелов и разделителей все числа, которые будут напечатаны на экране при выполнении вызова F(9). Числа должны быть записаны в том же порядке, в котором они выводятся на экран.

    Похожие задания для тренировки

    ✍ Решение:

      Рассмотрим алгоритм:

    • В данном фрагменте программы рекурсивная процедура вызывает саму себя дважды.
    • Благодаря условию, находящемуся в процедуре (if n > 0 — условие остановки рекурсии), обеспечивается выход из рекурсии и не происходит «зацикливания».
    • Выполнение процедур закончится, когда в каждой из вызванных процедур выполнятся по две внутренние процедуры, и условие if n > 0 перестанет работать (т.е. когда параметр процедуры n станет <= 0).
    • div — целочисленное деление, т.е., например:
    • 5 div 2 = 2
      1 div 2 = 0
      
    • Отобразим пошагово выполнение каждой процедуры, двигаясь сверху вниз и оставляя отступы слева с каждым новым шагом. В каждой строке будем отображать порядковый номер шага. Под вызовом каждой процедуры разместим именно те действия, которые происходят в данной процедуре:
    •    F(9)
      1: 9  F(6)    (9 - 3 = 6)
      2:     6   F(3)    (6 - 3 = 3)
      3:          3    F(0)    (3 - 3 = 0, условие не работает)
      4:         F(1)  (3 div 3 = 1)
      5:          1    F(-2)    (1 - 3 = -2, условие не работает)
      6:         F(0)    (1 div 3 = 0, условие не работает)
      7:    F(2) (6 div 3 = 2)
      8:     2   F(-1)    (2 - 3 = -1, условие не работает)
      9:    F(0)    (2 div 3 = 0, условие не работает)
      10:F(3)  (9 div 3 = 3)
      11:3  F(0)     (3 - 3 = 0, условие не работает) 
      12:F(1)  (3 div 3 = 1)   
      13: 1   F(-2)     (1 - 3 = -2, условие не работает) 
      
    • Выделены те числа, которые выводятся на экран. Подчеркнуты те процедуры, в которых условие не работает, соответственно, ничего на экран не выводится.
    • Перепишем по порядку все выводимые на экран числа сверху вниз: 9631231

    Результат: 9631231

    Подробное решение 16 (11) задания демоверсии ЕГЭ 2018 года смотрите на видео:
    📹 Видео 1 способ
    📹 Видеорешение на RuTube здесь

    2 способ:
    📹 YouTube здесь
    📹 Видеорешение на RuTube здесь


    16_7:

    Ниже записан рекурсивный алгоритм F. Запишите подряд без пробелов и разделителей все числа, которые будут напечатаны на экране при выполнении вызова F(130).
    Числа должны быть записаны в том же порядке, в котором они выводятся на экран.

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    procedure F(n: integer);
    begin
      if n > 1 then
      begin
        write(n);
        F(n div 10);
        F(n - 40)
       end
    end;
    Бейсик:

    SUB F(n)
      IF n > 1 THEN
         PRINT n
         F(n  10)
         F(n - 40)
      END IF
    END SUB
    Python:

    def F(n):
      if n > 1:
         print(n)
         F(n // 10)
         F(n - 40)
    С++:

    void F(int n){
      if (n > 1){
        std::cout <<n;
        F(n / 10);
        F(n - 40);
      }
    }

    ✍ Решение:

      Разберем алгоритм программы:

    • В данном фрагменте программы рекурсивная процедура F вызывает саму себя дважды.
    • В процедуре находится условие if n > 1 — условие остановки рекурсии, благодаря которому обеспечивается выход из рекурсии и не происходит «зацикливания».
    • Выполнение фрагмента программы закончится, когда в каждой из вызванных процедур выполнятся по две внутренние процедуры, и условие if n > 1 перестанет работать (т.е. когда параметр процедуры n станет <= 1).
    • div — целочисленное деление, т.е., например:
    • 5 div 3 = 1
      1 div 3 = 0
      
    • Выполним трассировку кода процедуры: двигаться будем пошагово сверху вниз, оставляя отступы слева с каждым новым шагом. В каждой строке будем отображать порядковый номер шага. Под вызовом каждой процедуры разместим именно те действия, которые происходят в данной процедуре:
    •    F(130) 130  
      1: ➥  F(13) (130 div 10 = 13) 13
      2:           ➥ F(1) условие не работает! 1 ≤ 0
      3:           ➥ F(-27) условие не работает! -27 ≤ 0
      4: ➥  F(90) (130 - 40 = 90) 90        
      5:           ➥ F(9) (90 div 10 = 9) 9
      6:                    ➥ F(0) условие не работает! 0 ≤ 0
      7:                    ➥ F(-31) условие не работает! -31 ≤ 0
      8:           ➥  F(50) (90 - 40 = 50) 50
      9:                     ➥  F(5) (50 div 10 = 5) 5
      10:                              ➥ F(0) условие не работает! 0 ≤ 0
      11:                              ➥ F(-35) условие не работает! -35 ≤ 0
      12:                    ➥  F(10) (50 - 40 = 10) 10
      13:                              ➥ F(1) условие не работает! 1 ≤ 0
      14:                              ➥ F(-30) условие не работает! -30 ≤ 0
      
    • Выделены красным цветом те числа, которые выводятся на экран. Подчеркнуты те процедуры, в которых условие не работает, соответственно, ничего на экран не выводится.
    • Перепишем сверху вниз все выводимые на экран числа: 1301390950510

    Результат: 1301390950510

    Предлагаем посмотреть видео разбора задания:
    📹 YouTube здесь

    📹 Видеорешение на RuTube здесь


    16_11:

    Определите, что выведет на экран программа при вызове F(5).

    Паскаль:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    
    procedure F(n: integer); forward;
    procedure G(n: integer); forward;
    procedure F(n: integer);
    begin
      if n > 2 then
       begin
        write(n);
        F(n - 1);
        G(n - 2);
       end
      else
        write(n+2);
    end;
    procedure G(n: integer);
    begin
      write(n);
      if n > 2 then
       begin
        G(n - 1);
        F(n - 2);
       end;
    end;
    Бейсик:

    DECLARE SUB F(n)
    DECLARE SUB G(n)
    SUB F(n)
      IF n > 2 THEN
         PRINT n
         F(n - 1)
         G(n - 2)
      ELSE
         PRINT n+2
      END IF
    END SUB
    SUB G(n)
      PRINT n
      IF n > 2 THEN
         G(n - 1)
         F(n - 2)
      END IF
    END SUB
    Python:

    def F(n):
        if n > 2:
            print(n, end='')
            F(n - 1)
            G(n - 2)
        else:
            print(n+2, end='')
     
    def G(n):
        print(n, end='')
        if n > 2:
            G(n - 1)
            F(n - 2)
    С++:

    void G(int n);
    void F(int n) {
    	if (n > 2) {
    	  std::cout << n;
    	  F(n - 1);
    	  G(n - 2);		
    	  }
    	else
    	  std::cout << n+2;
    }
    void G(int n) {
    	std::cout << n;
    	if (n > 2) {
    	  G(n - 1);
    	  F(n - 2);
    	  } 
    }

      
    Типовые задания для тренировки

    ✍ Решение:

    • При истинности условия функция F также, как и функция G «запускает» еще две функции: функция F: 1)F(n — 1) и 2)G(n — 2), а функция G: 1)G(n — 1) и 2)F(n — 2).
    • Рассмотрим последовательно алгоритм работы функций, нумеруя вызовы функций. Для удобства будем делать отступы для каждой функции. Таким образом, для вызова каждой функции должно быть два внутренних вызова:
    • F(5) = 5 (на экране)
      1) F(n - 1), т.е. F(4)
          F(4) = 4(на экране)
          1) F(n - 1), т.е. F(3)
                 F(3) = 3(на экране)
                 1) F(n - 1), т.е. F(2)
                        F(2) = n + 2 = 4 (на экране) (блок else)
                 2) G(n - 2), т.е. G(1)
         	          G(1) = 1 (на экране)
          2) G(n - 2), т.е. G(2)
      	   G(2) = 2 (на экране)
      2) G(n - 2), т.е. G(3)
          G(3) = 3 (на экране)
          1)G(n - 1), т.е. G(2)
                 G(2) = 2 (на экране)
          2) F(n - 2), т.е. F(1)
                 F(1) = n + 2 = 3 (на экране) (блок else)
      
    • Перепишем сверху вниз все цифры, выведенные на экран:
    • 543412323

    Ответ: 543412323

    Хотите готовиться со мной к ЕГЭ?
    Пишите: ydkras@mail.ru
    Немного обо мне.

    Задача 16 ЕГЭ по информатике посвящена рекурсивным функциям. 

    Рекурсивные функции — такие функции, которые обращаются к самим себе.

    Рассмотрим задачу 16 из демонстрационного варианта ЕГЭ 2022 г. с сайта ФИПИ:

    Алгоритм вычисления значения функции F(n), где n – натуральное число,
    задан следующими соотношениями:
    F(n) = 1 при n = 1;
    F(n) = n + F(n − 1), если n чётно,
    F(n) = 2 × F(n − 2), если n > 1 и при этом n нечётно.
    Чему равно значение функции F(26)?

    Вообще говоря, данная задача решается на бумаге. Для этого придется составить таблицу, содержащую значения F(1), F(2) и т.д. — до F(26) включительно. Но составлять таблицу из 26 строк вручную несколько трудоемко, да и вероятность ошибиться ненулевая. Гораздо проще составить эту таблицу в excel.  

    Но, на мой взгляд, ещё проще решать данную задачу программно.

    Сначала напишем рекурсивную функцию на Питоне:

    def F(n):
        if n==1: return 1
        if n%2 == 0: return n+F(n-1)
        return 2*F(n-2)

    Просто, не так ли? Мы практически переписали определение функции строчка в строчку. 

    А почему в последней строке нет условия? Всё очень просто: оператор return прекращает вычисление функции, поэтому если, например, n равно 1, то операторы после строки, в которой проверяется соответствующее условие,  выполняться не будут. Поэтому если выполнение дошло до последней строки функции, то случаи n, равного единице и четного n исключены.

    Теперь мы можем узнать ответ данной задачи, написав дополнительно лишь строку 

    print(F(26)) 

    (Ответ равен 4122.)

    На сайте К.Полякова задачи на рекурсивные функции более сложны, но и их решить программным путем обычно очень просто. 

    Рассмотрим, например, задачу из варианта 8:

    (№ 3820) Алгоритм вычисления значения функции F(n), где n – целое число, задан следующими соотношениями:
    F(n) = 1, при n < 2,
    F(n) = F(n/3) — 1, когда n ≥ 2 и делится на 3,
    F(n) = F(n — 1) + 7, когда n ≥ 2 и не делится на 3.
    Назовите минимальное значение n, для которого F(n) равно 111.

    Приведем полную программу для решения этой задачи:

    def F(n):
        if n<2: return 1
        if n%3 == 0: return F(n//3)-1
        return F(n-1)+7

    n=1
    while True:
        if F(n)==111:
            print(n)
            break
        n += 1

    Легко видеть, что мы организуем бесконечный цикл и последовательно вычисляем F(1), F(2) и т.д. Как только F(n) будет равно 111, это значение печатается и цикл прерывается.

    В данном случае ответ равен 32804. Перебрать вручную такое количество значений n нереально, поэтому в данном случае программный способ — единственно разумный метод решения.

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

    Недопустимо медленная рекурсивная функция

    Рассмотрим такую задачу:

    Пусть  имеется следующая функция F(n):

    F(n)=1 при n<3;
    F(n)=F(n-1)+F(n-2) при n>=3.

    Чему равно F(45)?

    Казалось бы, всё просто. Пишем программу из четырех строчек:

    def F(n):
        if n<3: return 1
        return F(n-1)+F(n-2)
    print (F(45))

    Запускаем программу и… не можем дождаться, когда она выполнится и отпечатает результат.

    В чем тут дело? А в том, что для того, чтобы вычислить, например, F(10), нам требуется вычислить F(9) и F(8). Для вычисления F(9) и F(8) будут вычислены F(8), F(7), F(7) и F(6). Как можно видеть, значения функции для одного и того же параметра многократно перевычисляются, а увеличение n на 1 приводит к увеличению объёма (и времени) вычислений примерно в два раза. 

    Вот таблица, показывающая время вычисления функции F(n) для различных n.

    n F(n) Время, с
    33 3524578 1.40
    34 5702887 2.31
    35 9227465 4.21
    36 14930352 6.91
    37 24157817 11.24
    38 39088169 18.93
    39 63245986 31.45
    40 102334155 57.24
    41 165580141 104.53

    Как говорится, тенденция налицо, и понятно, что дождаться, когда такая функция вычислит F(45), непросто. 

    Какой же выход из данной ситуации?

    Во-первых, можно перейти на какой-либо более эффективный язык (паскаль или C++). Но даже эти языки не спасут, если потребуется вычислить, скажем, F(100).

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

    def F(n):
        if n<3:
            return 1
        f1=1
        f2=1
        f3=f1+f2
        i=3  
        while i<n:
            f1=f2
            f2=f3
            f3=f1+f2
            i += 1
        return f3  
    print(F(45)) 

    Эта программа выполняется мгновенно.

    Но в случае более сложной функции написать её нерекурсивный эквивалент может оказаться непростым делом. Гораздо проще сделать так, чтобы ранее вычисленные значения нашей функции повторно не вычислялись. Для этого воспользуемся структурой данных, которая называется «ассоциативный массив» или «словарь». В этой структуре хранятся пары «ключ»-«значение». В нашем случае ключом будет входной параметр n, а значением — значение функции F(n).

    Вот программа, использующая словарь:

    def F(n):
        if not n in f:
            if n < 3:
                f[n] = 1
            else:
                f[n] = F(n-1)+F(n-2)
        return f[n]

        f={}
    print(F(45))

    Функция F(n) проверяет, есть ли значение n в словаре f. Если нет, то это значение вычисляется и заносится в словарь (в строках вида f[n]=…). Если же такое значение уже есть, то ничего вычислять не надо. В последней строке функция возвращает значение f[n] из словаря f.

    Перед вызовом функции в основной программе создается пустой словарь f (в строке f={}). 

    Если воспользоваться условным выражением if-else, то вышеприведенную программу можно сильно сократить:

    def F(n):
        if not n in f:
            f[n] = 1 if n < 3 else F(n-1)+F(n-2)
        return f[n]

        f={}
    print(F(45))

    Когда рекурсия не завершается

    (Продолжение следует немного позже.)

    (c) Ю.Д.Красильников, 2021-2022 г.

    Версия для печати и копирования в MS Word

    1

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    DECLARE FUNCTION F(n)

    DECLARE FUNCTION G(n)

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n — 1) + G(n-2)

      ELSE

        F = 1

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n — 1) + F(n-2)

      ELSE

        G = 1

      END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n-1)+ G(n-2)

        else: return 1

    def G(n):

        if n > 2:

            return G(n-1) + F(n-2)

        else: return 1

    Паскаль Алгоритмический язык

    function F(n: integer): integer;

    begin

      if n > 2 then

        F := F(n — 1) + G(n — 2)

      else

        F := 1;

    end;

    function G(n: integer): integer;

    begin

      if n > 2 then

        G := G(n — 1) + F(n — 2)

      else

        G := 1;

    end;

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n — 1) + G(n — 2)

        иначе

          знач := 1

      все

    кон

    алг цел G(цел n)

    нач

      если n > 2

        то

          знач := G(n — 1) + F(n — 2)

        иначе

          знач := 1

      все

    кон

    Си

    int F(int n)

    {

      if (n > 2)

        return F(n-1) + G(n-2);

      else return 1;

    }

    int G(int n)

    {

      if (n > 2)

        return G(n-1) + F(n-2);

      else return 1;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(7)?

    Ответ:


    2

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    DECLARE FUNCTION F(n)

    DECLARE FUNCTION G(n)

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n — 1) + G(n-2)

      ELSE

        F = 1

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n — 1) + F(n-2)

      ELSE

        G = 1

      END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n-1)+ G(n-2)

        else: return 1

    def G(n):

        if n > 2:

            return G(n-1) + F(n-2)

        else: return 1

    Паскаль Алгоритмический язык

    function F(n: integer): integer;

    begin

      if n > 2 then

        F := F(n — 1) + G(n — 2)

      else

        F := 1;

    end;

    function G(n: integer): integer;

    begin

      if n > 2 then

        G := G(n — 1) + F(n — 2)

      else

        G := 1;

    end;

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n — 1) + G(n — 2)

        иначе

          знач := 1

      все

    кон

    алг цел G(цел n)

    нач

      если n > 2

        то

          знач := G(n — 1) + F(n — 2)

        иначе

          знач := 1

      все

    кон

    Си

    int F(int n)

    {

      if (n > 2)

        return F(n-1) + G(n-2);

      else return 1;

    }

    int G(int n)

    {

      if (n > 2)

        return G(n-1) + F(n-2);

      else return 1;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(8)?

    Ответ:


    3

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n — 1) + G(n — 2)

      ELSE

        F = n

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n — 1) + F(n — 2)

      ELSE

        G = n + 1

      END IF

    END FUNCTION

    def F(n):

      if n > 2:

        return F(n-1) + G(n-2)

      else: return n

    def G(n):

      if n > 2:

        return G(n-1) + F(n-2)

      else: return n+1

    Паскаль Алгоритмический язык

    function F(n: integer): integer;

    begin

      if n > 2 then

        F := F(n — 1) + G(n — 2)

      else

        F := n;

    end;

    function G(n: integer): integer;

    begin

      if n > 2 then

        G := G(n — 1) + F(n — 2)

      else

        G := n+1;

    end;

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n — 1)+G(n — 2)

        иначе

          знач := n

      все

    кон

    алг цел G(цел n)

    нач

      если n > 2

        то

          знач := G(n — 1)+F(n — 2)

        иначе

          знач := n+1

      все

    кон

    Си

    int F(int n)

    {

      if (n > 2)

        return F(n-1) + G(n-2);

      else return n;

    }

    int G(int n)

    {

      if (n > 2)

        return G(n-1) + F(n-2);

      else return n + 1;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(6)?

    Ответ:


    4

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n — 1) + G(n — 2)

      ELSE

        F = n

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n — 1) + F(n — 2)

      ELSE

        G = n + 1

      END IF

    END FUNCTION

    def F(n):

      if n > 2:

        return F(n-1) + G(n-2)

      else: return n

    def G(n):

      if n > 2:

        return G(n-1) + F(n-2)

      else: return n+1

    Паскаль Алгоритмический язык

    function G(n:integer): integer; forward;

    function F(n: integer): integer;

    begin

      if n > 2 then

        F := F(n — 1) + G(n — 2)

      else

        F := n;

    end;

    function G(n: integer): integer;

    begin

      if n > 2 then

        G := G(n — 1) + F(n — 2)

      else

        G := n+1;

    end;

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n — 1)+G(n — 2)

        иначе

          знач := n

      все

    кон

    алг цел G(цел n)

    нач

      если n > 2

        то

          знач := G(n — 1)+F(n — 2)

        иначе

          знач := n+1

      все

    кон

    Си

    int F(int n)

    {

      if (n > 2)

        return F(n-1) + G(n-2);

      else return n;

    }

    int G(int n)

    {

      if (n > 2)

        return G(n-1) + F(n-2);

      else return n + 1;

    }

    Чему будет равно значение, вычисленное при выполнении вызова G(6)?

    Ответ:


    5

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n-1)+G(n-1)+F(n-2)

      ELSE

        F = n

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n-1)+F(n-1)+G(n-2)

      ELSE

        G = n+1

      END IF

    END FUNCTION

    def F(n):

      if n > 2:

        return F(n-1)+G(n-1)+F(n-2)

      else: return n

    def G(n):

      if n > 2:

        return G(n-1)+F(n-1)+G(n-2)

      else: return n+1

    Паскаль Алгоритмический язык

    function F(n: integer):

    integer;

    begin

      if n > 2 then

        F := F(n-1)+G(n-1)+F(n-2)

      else

        F := n;

    end;

    function G(n: integer):

    integer;

    begin

      if n > 2 then

        G := G(n-1)+F(n-1)+G(n-2)

      else

        G := n+1;

    end;

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n-1)+G(n-1)+F(n-2)

        иначе

          знач := n

      все

    кон

    алг цел G(цел n)

    нач

      если n > 2

      то

        знач := G(n-1)+F(n-1)+G(n-2)

      иначе

        знач := n+1

      все

    кон

    Си

    int F(int n) {

      if (n > 2)

        return F(n-1)+G(n-1)+F(n-2);

      else return n;

    }

    int G(int n){

      if (n > 2)

        return G(n-1)+F(n-1)+G(n-2);

      else return n+1;

    }

    Чему будет равно значение, вычисленное при выполнении вызова G(5)?

    Ответ:


    6

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n-1)+G(n-1)+F(n-2)

      ELSE

        F = n

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n-1)+F(n-1)+G(n-2)

      ELSE

        G = n+1

      END IF

    END FUNCTION

    def F(n):

      if n > 2:

        return F(n-1)+G(n-1)+F(n-2)

      else: return n

    def G(n):

      if n > 2:

        return G(n-1)+F(n-1)+G(n-2)

      else: return n+1

    Паскаль Алгоритмический язык

    function F(n: integer):

    integer;

    begin

      if n > 2 then

        F := F(n-1)+G(n-1)+F(n-2)

      else

        F := n;

    end;

    function G(n: integer):

    integer;

    begin

      if n > 2 then

        G := G(n-1)+F(n-1)+G(n-2)

      else

        G := n+1;

    end;

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n-1)+G(n-1)+F(n-2)

        иначе

          знач := n

      все

    кон

    алг цел G(цел n)

    нач

      если n > 2

      то

        знач := G(n-1)+F(n-1)+G(n-2)

      иначе

        знач := n+1

      все

    кон

    Си

    int F(int n) {

      if (n > 2)

        return F(n-1)+G(n-1)+F(n-2);

      else return n;

    }

    int G(int n){

      if (n > 2)

        return G(n-1)+F(n-1)+G(n-2);

      else return n+1;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(5)?

    Ответ:


    7

    Ниже на пяти языках программирования записаны рекурсивные функции F и G.

    Бейсик Python

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n-1)+G(n-1)+F(n-2)

      ELSE

        F = n

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n-1)+F(n-1)+G(n-2)

      ELSE

        G = 3-n

      END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n-1)+G(n-1)+F(n-2)

        else: return n

    def G(n):

        if n > 2:

            return G(n-1)+F(n-1)+G(n-2)

        else: return 3-n

    Алгоритмический язык Паскаль

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n-1)+G(n-1)+F(n-2)

        иначе

          знач := n

        все

    кон

    алг цел G(цел n)

    нач

      если n > 2

        то

          знач := G(n-1)+F(n-1)+G(n-2)

        иначе

          знач := 3-n

      все

    кон

    function F(n: integer): integer;

    begin

      if n > 2 then

        F := F(n-1)+G(n-1)+F(n-2)

      else

        F := n;

    end;

    function G(n: integer): integer;

    begin

      if n > 2 then

        G := G(n-1)+F(n-1)+G(n-2)

      else

        G := 3-n;

    end;

    Си

    int F(int n){

    if (n > 2)

    return F(n-1)+G(n-1)+F(n-2);

    else return n;

    }

    int G(int n){

    if (n > 2)

    return G(n-1)+F(n-1)+G(n-2);

    else return 3-n;

    }

    Чему будет равно значение, вычисленное при выполнении вызова G(5)?

    Ответ:


    8

    Ниже на пяти языках программирования записаны рекурсивные функции F и G.

    Бейсик Python

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n-1)+G(n-1)+F(n-2)

      ELSE

        F = n

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n-1)+F(n-1)+G(n-2)

      ELSE

        G = 3-n

      END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n-1)+G(n-1)+F(n-2)

        else: return n

    def G(n):

        if n > 2:

            return G(n-1)+F(n-1)+G(n-2)

        else: return 3-n

    Алгоритмический язык Паскаль

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n-1)+G(n-1)+F(n-2)

        иначе

          знач := n

        все

    кон

    алг цел G(цел n)

    нач

      если n > 2

        то

          знач := G(n-1)+F(n-1)+G(n-2)

        иначе

          знач := 3-n

      все

    кон

    function F(n: integer): integer;

    begin

      if n > 2 then

        F := F(n-1)+G(n-1)+F(n-2)

      else

        F := n;

    end;

    function G(n: integer): integer;

    begin

      if n > 2 then

        G := G(n-1)+F(n-1)+G(n-2)

      else

        G := 3-n;

    end;

    Си

    int F(int n){

    if (n > 2)

    return F(n-1)+G(n-1)+F(n-2);

    else return n;

    }

    int G(int n){

    if (n > 2)

    return G(n-1)+F(n-1)+G(n-2);

    else return 3-n;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(5)?

    Ответ:


    9

    Ниже записаны две рекурсивные функции, F и G:

    function F(n: integer): integer;

     begin

      if (n > 2) then F := F(n — 1) + G(n — 1) + F(n-2)

     else

    F := n;

     end;

    function G(n: integer): integer;

     begin

      if (n > 2) then G := G(n — 1) + F(n — 1) + G(n-2)

     else

    G := n;

     end;

    Чему будет равно значение, вычисленное при выполнении вызова F(5)?

    Ответ:


    10

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

     FUNCTION F(n)

      IF n > 2 THEN

        F = F(n — 1) +G(n — 2)

      ELSE

         F = 2

      END IF

     END FUNCTION

     FUNCTION G(n)

      IF n > 2 THEN

        G = G(n — 1) +F(n — 2)

      ELSE

         G = 2

      END IF

     END FUNCTION

    def F(n):

        if n > 2:

          return F(n-1) + G(n-2)

        else: return 2

    def G(n):

        if n > 2:

          return G(n-1) + F(n-2)

        else: return 2

    Паскаль Алгоритмический язык

    function F(n : integer): integer;

     begin

      if n > 2 then

       F := F(n — 1) + G(n — 2)

      else

       F := 2;

     end;

    function G(n : integer): integer;

     begin

      if n > 2 then

       G := G(n — 1) + F(n — 2)

      else

       G := 2;

     end;

    алг цел F(цел n)

     нач

      если n > 2

      то

        знач:= F(n-1) + G(n-2)

      иначе

        знач:=2

      все

     кон

    алг цел G(цел n)

     нач

      если n > 2

      то

        знач:= G(n-1) + F(n-2)

      иначе

        знач:=2

      все

     кон

    Си

    int F(int n) {

        if (n > 2)

         return F(n-1) + G(n-2);

        else

         return 2;

    }

    int G(int n) {

        if (n > 2)

         return G(n-1) + F(n-2);

        else

         return 2;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(6)?

    Ответ:


    11

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

     FUNCTION F(n)

      IF n > 2 THEN

        F = F(n — 1) +G(n — 2)

      ELSE

         F = 2

      END IF

     END FUNCTION

     FUNCTION G(n)

      IF n > 2 THEN

        G = G(n — 1) +F(n — 2)

      ELSE

         G = 2

      END IF

     END FUNCTION

    def F(n):

        if n > 2:

          return F(n-1) + G(n-2)

        else: return 2

    def G(n):

        if n > 2:

          return G(n-1) + F(n-2)

        else: return 2

    Паскаль Алгоритмический язык

    function F(n : integer): integer;

     begin

      if n > 2 then

       F := F(n — 1) + G(n — 2)

      else

       F := 2;

     end;

    function G(n : integer): integer;

     begin

      if n > 2 then

       G := G(n — 1) + F(n — 2)

      else

       G := 2;

     end;

    алг цел F(цел n)

     нач

      если n > 2

      то

        знач:= F(n-1) + G(n-2)

      иначе

        знач:=2

      все

     кон

    алг цел G(цел n)

     нач

      если n > 2

      то

        знач:= G(n-1) + F(n-2)

      иначе

        знач:=2

      все

     кон

    Си

    int F(int n) {

        if (n > 2)

         return F(n-1) + G(n-2);

        else

         return 2;

    }

    int G(int n) {

        if (n > 2)

         return G(n-1) + F(n-2);

        else

         return 2;

    }

    Чему будет равно значение, вычисленное при выполнении вызова G(6)?

    Ответ:


    12

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

     FUNCTION F(n)

      IF n > 1 THEN

        F = F(n — 1) +G(n — 1)

      ELSE

         F = n

      END IF

     END FUNCTION

     FUNCTION G(n)

      IF n > 1 THEN

        G = G(n — 1) +F(n)

      ELSE

         G = n

      END IF

     END FUNCTION

    def F(n):

        if n > 1:

          return F(n-1) + G(n-1)

        else: return n

    def G(n):

        if n > 1:

          return G(n-1) + F(n)

        else: return n

    Паскаль Алгоритмический язык

    function F (n : integer) : integer;

     begin

      if n > 1 then

       F := F(n — 1) + G(n — 1)

      else

       F := n;

     end;

    function G (n : integer) : integer;

     begin

      if n > 1 then

       G := G(n — 1) + F(n)

      else

       G := n;

     end;

    алг цел F(цел n)

     нач

      если n > 1

      то

        знач:= F(n-1) + G(n-1)

      иначе

        знач:=n

      все

     кон

    алг цел G(цел n)

     нач

      если n > 1

      то

        знач:= G(n-1) + F(n)

      иначе

        знач:=n

      все

     кон

    Си

    int F(int n) {

        if (n > 1)

         return F(n-1) + G(n-1);

        else

         return n;

    }

    int G(int n) {

        if (n > 1)

         return G(n-1) + F(n);

        else

         return n;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(5)?

    Ответ:


    13

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

     FUNCTION F(n)

      IF n > 1 THEN

        F = F(n — 1) +G(n — 1)

      ELSE

         F = n

      END IF

     END FUNCTION

     FUNCTION G(n)

      IF n > 1 THEN

        G = G(n — 1) +F(n)

      ELSE

         G = n

      END IF

     END FUNCTION

    def F(n):

        if n > 1:

          return F(n-1) + G(n-1)

        else: return n

    def G(n):

        if n > 1:

          return G(n-1) + F(n)

        else: return n

    Паскаль Алгоритмический язык

    function F (n : integer) : integer;

     begin

      if n > 1 then

       F := F(n — 1) + G(n — 1)

      else

       F := n;

     end;

    function G (n : integer) : integer;

     begin

      if n > 1 then

       G := G(n — 1) + F(n)

      else

       G := n;

     end;

    алг цел F(цел n)

     нач

      если n > 1

      то

        знач:= F(n-1) + G(n-1)

      иначе

        знач:=n

      все

     кон

    алг цел G(цел n)

     нач

      если n > 1

      то

        знач:= G(n-1) + F(n)

      иначе

        знач:=n

      все

     кон

    Си

    int F(int n) {

        if (n > 1)

         return F(n-1) + G(n-1);

        else

         return n;

    }

    int G(int n) {

        if (n > 1)

         return G(n-1) + F(n);

        else

         return n;

    }

    Чему будет равно значение, вычисленное при выполнении вызова G(5)?

    Ответ:


    14

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n-1) +G (n-2)

      ELSE

        F = n

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n-1) + F(n-2)

      ELSE

        G = 3-n

      END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n-1) + G(n-2)

        else: return n

    def G(n):

        if n > 2:

            return G(n-1) + F(n-2)

        else: return 3-n

    Паскаль Алгоритмический язык

    function F(n: integer): integer;

    begin

      if n > 2 then

          F := F(n-1) + G(n-2)

      else

          F := n;

    end;

    function G(n: integer): integer;

    begin

      if n > 2 then

        G := G(n-1) + F(n-2)

      else

          G := 3-n;

    end;

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n-1) + G(n-2)

        иначе

          знач := n

      все

    кон

    алг цел G(цел n)

    нач

      если n > 2

        то

          знач := G(n-1) + F(n-2)

        иначе

          знач := 3-n

      все

    кон

    Си

    int F(int n) {

        if (n > 2)

            return F(n-1) + G(n-2);

        else return n;

    }

    int G(int n) {

        if (n > 2)

            return G(n-1) + F(n-2);

        else return 3-n;

    }

    Чему будет равно значение, вычисленное при выполнении вызова G(6)?

    Ответ:


    15

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    FUNCTION F(n)

      IF n > 2 THEN

        F = F(n-1) +G (n-2)

      ELSE

        F = n

      END IF

    END FUNCTION

    FUNCTION G(n)

      IF n > 2 THEN

        G = G(n-1) + F(n-2)

      ELSE

        G = 3-n

      END IF

    END FUNCTION

    def F(n):

      if n > 2:

        return F(n-1) + G(n-2)

      else: return n

    def G(n):

      if n > 2:

        return G(n-1) + F(n-2)

      else: return 3-n

    Паскаль Алгоритмический язык

    function F(n: integer): integer; forward;

    function G(n: integer): integer; forward;

    function F(n: integer): integer;

    begin

    if n>2 then

    F:=F(n-1)+G(n-2)

    else

    F:=n;

    end;

    function G(n:integer):integer;

    begin

    if n>2 then

    G:=G(n-1)+F(n-2)

    else

    G:=3-n;

    end;

    алг цел F(цел n)

    нач

      если n > 2

        то

          знач := F(n-1) + G(n-2)

        иначе

          знач := n

      все

    кон

    алг цел G(цел n)

    нач

      если n > 2

        то

          знач := G(n-1) + F(n-2)

        иначе

          знач := 3-n

      все

    кон

    Си

    int F(int n) {

      if (n > 2)

        return F(n-1) + G(n-2);

      else return n;

    }

    int G(int n) {

      if (n > 2)

        return G(n-1) + F(n-2);

      else return 3-n;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(6)?

    Ответ:


    16

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    FUNCTION F(n)

        IF n > 2 THEN

            F = F(n — 1) + G(n — 2)

        ELSE

            F = n

        END IF

    END FUNCTION

    FUNCTION G(n)

        IF n > 2 THEN

            G = G(n — 1) + F(n — 2)

        ELSE

            G = n+1

        END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n — 1)+ G(n — 2)

        else: return n

    def G(n):

        if n > 2:

            return G(n — 1)+ F(n — 2)

        else: return n+1

    Паскаль Алгоритмический язык

    function F(n: integer): integer;

    begin

        if n > 2 then

            F := F(n — 1) + G(n — 2)

        else

            F := n;

    end;

    function G(n: integer): integer;

    begin

        if n > 2 then

            G := G(n — 1) + F(n — 2)

        else

            G := n+1;

    end;

    алг цел F(цел n)

    нач

        если n > 2

            то

                знач := F(n — 1)+G(n — 2)

            иначе

                знач := n

        все

    кон

    алг цел G(цел n)

    нач

        если n > 2

            то

                знач := G(n — 1)+F(n — 2)

            иначе

                знач := n+1

        все

    кон

    Си

    int F(int n)

    {

    if (n > 2)

    return F(n — 1) + G(n — 2);

    else return n;

    }

    int G(int n)

    {

    if (n > 2)

    return G(n — 1) + F(n -2);

    else return n+1;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(6)?

    Ответ:


    17

    Ниже на пяти языках программирования записаны две рекурсивные функции: F и G.

    Бейсик Python

    FUNCTION F(n)

        IF n > 2 THEN

            F = F(n — 1) + G(n — 2)

        ELSE

            F = n

        END IF

    END FUNCTION

    FUNCTION G(n)

        IF n > 2 THEN

            G = G(n — 1) + F(n — 2)

        ELSE

            G = n+1

        END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n — 1)+ G(n — 2)

        else: return n

    def G(n):

        if n > 2:

            return G(n — 1)+ F(n — 2)

        else: return n+1

    Паскаль Алгоритмический язык

    function F(n: integer): integer;

    begin

        if n > 2 then

            F := F(n — 1) + G(n — 2)

        else

            F := n;

    end;

    function G(n: integer): integer;

    begin

        if n > 2 then

            G := G(n — 1) + F(n — 2)

        else

            G := n+1;

    end;

    алг цел F(цел n)

    нач

        если n > 2

            то

                знач := F(n — 1)+G(n — 2)

            иначе

                знач := n

        все

    кон

    алг цел G(цел n)

    нач

        если n > 2

            то

                знач := G(n — 1)+F(n — 2)

            иначе

                знач := n+1

        все

    кон

    Си

    int F(int n)

    {

    if (n > 2)

    return F(n — 1) + G(n — 2);

    else return n;

    }

    int G(int n)

    {

    if (n > 2)

    return G(n — 1) + F(n -2);

    else return n+1;

    }

    Чему будет равно значение, вычисленное при выполнении вызова G(6)?

    Ответ:


    18

    Ниже на пяти языках программирования записаны рекурсивные функции F и G.

    Бейсик Python

    FUNCTION F(n)

        IF n > 2 THEN

            F = F(n — 1) + G(n — 2)

        ELSE

            F = n+1

        END IF

    END FUNCTION

    FUNCTION G(n)

        IF n > 2 THEN

            G = G(n — 1) + F(n — 2)

        ELSE

            G = n

        END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n — 1)+ G(n — 2)

        else: return n+1

    def G(n):

        if n > 2:

            return G(n — 1)+ F(n — 2)

        else: return n

    Паскаль Алгоритмический язык

    function F(n: integer): integer;

    begin

        if n > 2 then

            F := F(n — 1) + G(n — 2)

        else

            F := n+1;

    end;

    function G(n: integer): integer;

    begin

        if n > 2 then

            G := G(n — 1) + F(n — 2)

        else

            G := n;

    end;

    алг цел F(цел n)

    нач

        если n > 2

            то

                знач := F(n — 1)+G(n — 2)

            иначе

                знач := n+1

        все

    кон

    алг цел G(цел n)

    нач

        если n > 2

            то

                знач := G(n — 1)+F(n — 2)

            иначе

                знач := n

        все

    кон

    Си

    int F(int n)

    {

    if (n > 2)

    return F(n — 1) + G(n — 2);

    else return n+1;

    }

    int G(int n)

    {

    if (n > 2)

    return G(n — 1) + F(n -2);

    else return n;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(7)?

    Ответ:


    19

    Ниже на пяти языках программирования записаны рекурсивные функции F и G.

    Бейсик Python

    FUNCTION F(n)

        IF n > 2 THEN

            F = F(n — 1) + G(n — 2)

        ELSE

            F = n+1

        END IF

    END FUNCTION

    FUNCTION G(n)

        IF n > 2 THEN

            G = G(n — 1) + F(n — 2)

        ELSE

            G = n

        END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n — 1)+ G(n — 2)

        else: return n+1

    def G(n):

        if n > 2:

            return G(n — 1)+ F(n — 2)

        else: return n

    Паскаль Алгоритмический язык

    function F(n: integer): integer;

    begin

        if n > 2 then

            F := F(n — 1) + G(n — 2)

        else

            F := n+1;

    end;

    function G(n: integer): integer;

    begin

        if n > 2 then

            G := G(n — 1) + F(n — 2)

        else

            G := n;

    end;

    алг цел F(цел n)

    нач

        если n > 2

            то

                знач := F(n — 1)+G(n — 2)

            иначе

                знач := n+1

        все

    кон

    алг цел G(цел n)

    нач

        если n > 2

            то

                знач := G(n — 1)+F(n — 2)

            иначе

                знач := n

        все

    кон

    Си

    int F(int n)

    {

    if (n > 2)

    return F(n — 1) + G(n — 2);

    else return n+1;

    }

    int G(int n)

    {

    if (n > 2)

    return G(n — 1) + F(n -2);

    else return n;

    }

    Чему будет равно значение, вычисленное при выполнении вызова G(7)?

    Ответ:


    20

    Ниже на пяти языках программирования записана рекурсивная функция F.

    Бейсик Python

    FUNCTION F(n)

        IF n > 2 THEN

             F = F(n-2) + F(n2)

         ELSE

             F = n

        END IF

    END FUNCTION

    def F(n):

        if n > 2:

            return F(n-2) + F(n//2)

        else:

            return n

    Паскаль Алгоритмический язык

    function F(n: integer): integer;

    begin

        if n > 2 then

            F := F(n-2) + F(n div 2)

        else

            F := n

    end;

    алг цел F(цел n)

    нач

        если n > 2

            то

             знач := F(n-2) + F(div(n,2))

            иначе

                знач := n

        все

    кон

    Си

    int F(int n)

    {

        if (n > 2)

            return F(n-2) + F(n/2);

        else

            return n;

    }

    Чему будет равно значение, вычисленное при выполнении вызова F(9)?

    Ответ:

    Завершить тестирование, свериться с ответами, увидеть решения.

    Доброго времени суток каждому жителю Хабрвилля! Давненько я не писал статей! Пора это исправить!

    В сегодняшней статье поговорим о насущной для многих выпускников школ теме — ЕГЭ. Да-да-да! Я знаю, что Хабр — это сообщество разработчиков, а не начинающих айтишников, но сейчас ребятам как никогда нужна поддержка именно сообщества. Ребят опять посадили на дистант. Пока не ясно на какой период, но уже сейчас можно сказать, что ЕГЭ по информатике будет на компьютерах и его можно зарешать при помощи языка Python.

    Вот я и подумал, чтобы не получилось как в песне, стоит этим заняться. Я расскажу про все задачи первой части и их решения на примере демо варианта ЕГЭ за октябрь.

    Всех желающих — приглашаю ниже!

    Быстрый перевод из системы в систему

    В Python есть интересные функции bin(), oct() и hex(). Работают данные функции очень просто:

    bin(156) #Выводит '0b10011100'
    oct(156) #Выводит '0o234'
    hex(156) #Выводит '0x9c'

    Вывод в интерпретационном режиме

    Вывод в интерпретационном режиме

    Как вы видите, выводится строка, где 0b — означает, что число далее в двоичной системе счисления, 0o — в восьмеричной, а 0x — в шестнадцатеричной. Но это стандартные системы, а есть и необычные…

    Давайте посмотрим и на них:

    n = int(input()) #Вводим целое число
     
    b = '' #Формируем пустую строку
     
    while n > 0: #Пока число не ноль
        b = str(n % 2) + b #Остатот от деления нужной системы (в нашем сл записываем слева
        n = n // 2 #Целочисленное деление
     
    print(b) #Вывод

    Данная программа будет работать при переводе из десятичной системы счисления в любую до 9, так как у нас нет букв. Давайте добавим буквы:

    n = int(input()) #Вводим целое число
    
    b = '' #Формируем пустую строку
    
    while n > 0: #Пока число не ноль
    	if (n % 21) > 9: #Если остаток от деления больше 9...
    		if n % 21 == 10: #... и равен 10...
    			b = 'A' + b #... запишем слева A
    		elif n % 21 == 11:#... и равен 11...
    			b = 'B' + b#... запишем слева B
    
    '''
    
    И так далее, пока не дойдём до системы счисления -1 (я переводил в 21-ную систему и шёл до 20)
    
    '''
    
    		elif n % 21 == 11:
    			b = 'B' + b
    		elif n % 21 == 12:
    			b = 'C' + b
    		elif n % 21 == 13:
    			b = 'D' + b
    		elif n % 21 == 14:
    			b = 'E' + b
    		elif n % 21 == 15:
    			b = 'F' + b
    		elif n % 21 == 16:
    			b = 'G' + b
    		elif n % 21 == 17:
    			b = 'H' + b
    		elif n % 21 == 18:
    			b = 'I' + b
    		elif n % 21 == 19:
    			b = 'J' + b
    		elif n % 21 == 20:
    			b = 'K' + b
    	else: #Иначе (остаток меньше 10)
    		b = str(n % 21) + b #Остатот от деления записываем слева
    	n = n // 21 #Целочисленное деление
    
    print(b) #Вывод

    Способ объёмен, но понятен. Теперь давайте используем тот же функцию перевода из любой системы счисления в любую:

    def convert_base(num, to_base=10, from_base=10):
        # Перевод в десятичную систему
        if isinstance(num, str): # Если число - строка, то ...
            n = int(num, from_base) # ... переводим его в нужную систему счисления
        else: # Если же ввели число, то ...
            n = int(num) # ... просто воспринять его как число
        # Перевод десятичной в 'to_base' систему
        alphabet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" # Берём алфавит
        if n < to_base: # Если число меньше системы счисления в которую переводить...
            return alphabet[n] # ... вернуть значения номера в алфавите (остаток от деления)
        else: # Иначе...
            return convert_base(n // to_base, to_base) + alphabet[n % to_base] # ... рекурсивно обратиться к функии нахождения остатка

    Вызвав функцию вывода print(convert_base(156, 16, 10)) мы переведём 156 из 10 в 16 систему счисления, а введя print(convert_base('23', 21, 4)) переведёт 23 из 4-ичной в 21-ичную систему (ответ: B).

    Задача 2

    Все задания беру из первого октябрьского варианта (он же вариант № 9325894) с сайта Решу.ЕГЭ.

    Решение данной задачи совсем простое: банальный перебор.

    print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы
    for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1'
    	for x in range(2):
    		for z in range(2):
    			for w in range(2):
    				F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию
    				print(x, y, z, F) #Выводим результат

    Результат:

    Нам вывелась вся таблица истинности (1 = True, 0 = False). Но это не очень удобно. Обратите внимание, что в задании, функция равно 0, так и давайте подправим код:

    print('y', 'x', 'z', 'F') #Напечатаем заголовки таблицы
    for y in range(2): #Берём все переменные и меняем их в циклах '0' и '1'
    	for x in range(2):
    		for z in range(2):
    			for w in range(2):
    				F = ((not x or y) == (not z or w)) or (x and w) #Записываем функцию
    				if not F:
    					print(x, y, z, F) #Выводим результат

    Результат:

    Далее — простой анализ.

    Задача 5

    Данная задача легко решается простой последовательностью действий в интерпретационном режиме:

    Задача 6

    Перепечатали и получили ответ:

    s = 0
    k = 1
    while s < 66:
        k += 3
        s += k
    print(k)

    Задача 12

    В очередной раз, просто заменим слова на код:

    a = '9' * 1000
    
    while '999' in a or '888' in a:
    	if '888' in a:
    		a = a.replace('888', '9', 1)
    	else:
    		a = a.replace('999', '8', 1)
    print(a)

    Задача 14

    Компьютер железный, он всё посчитает:

    a = 4 ** 2020 + 2 ** 2017 - 15
    k = 0
    
    while a > 0:
        if a % 2 == 1:
        	k += 1
        a = a // 2
    
    print(k)

    Задача 16

    Опять же, просто дублируем программу в python:

    def F(n):
        if n > 0:
            F(n // 4)
            print(n)
            F (n - 1)
    print(F(5))

    Результат:

    Задача 17

    Задача с файлом. Самое сложное — достать данные из файла. Но где наша не пропадала?!

    with open("17.txt", "r") as f: #Открыли файл 17.txt для чтения
        text = f.read() #В переменную text запихнули строку целиком
    a = text.split("n") #Разбили строку энтерами (n - знак перехода на новую строку)
    
    k = 0 #Стандартно обнуляем количество
    m = -20001 #Так как у нас сумма 2-ух чисел и минимальное равно -10000, то минимум по условию равен -20000, поэтому...
    
    for i in range(len(a)): #Обходим все элементы массива
    	if (int(a[i - 1]) % 3 == 0) or (int(a[i]) % 3 == 0): #Условное условие
    		k += 1 #Счётчик
    		if int(a[i - 1]) + int(a[i]) > m: #Нахождение минимума
    			m = int(a[i - 1]) + int(a[i])
    
    print(k, m) #Вывод

    Немного пояснений. Функция with() открывает файл считывает данные при помощи функции read() и закрывает файл. В остальном — задача стандартна.

    Задача 19, 20 и 21

    Все три задачи — задачи на рекурсию. Задачи идентичны, а вопросы разные. Итак, первая задача:

    Пишем рекурсивную функцию и цикл перебора S:

    def f(x, y, p): #Рекурсивная функция
    	if x + y >= 69 or p > 3: #Условия завершения игры
    		return p == 3
    	return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
    		   f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
    
    for s in range (1, 58 + 1): #Перебор S
    	if f(10, s, 1): #Начали с 10 камней
    		print(s)
    		break

    Немного пояснений. В рекурсивной функции существует 3 переменные x — число камней в первой куче, y — число камней во второй куче, p — позиция. Позиция рассчитывается по таблице:

    Игра

    Петя

    Ваня

    Петя

    Ваня

    Петя

    p

    1

    2

    3

    4

    5

    6

    Далее — всё по условию задачи.

    Вторая задача на теорию игр:

    Все отличия в рамке. Ну и код, соответственно, не сильно отличается:

    def f(x, y, p): #Рекурсивная функция
    	if x + y >= 69 or p > 4: #Условия завершения игры
    		return p == 4
    	if p % 2 != 0:
    		return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
    			   f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
    	else:
    		return f(x + 1, y, p + 1) and f(x, y + 1, p + 1) and
    			   f(x * 2, y, p + 1) and f(x, y * 3, p + 1) #Варианты действий
    
    
    for s in range (1, 58 + 1): #Перебор S
    	if f(10, s, 1): #Начали с 10 камней
    		print(s)

    Отличия:

    1. Выиграл Петя, соответственно, позиция 4

    2. Так как Петя не может выиграть за один ход — он выигрывает за 2 хода (and, а не or на нечётных позициях (играх Пети))

    3. Убрали break, так как нам нужны все S, а не единственный

    Последняя вариация задачи:

    Сразу код:

    def f(x, y, p): #Рекурсивная функция
    	if x + y >= 69 or p > 5: #Условия завершения игры
    		return p == 3 or p == 5
    	if p % 2 == 0:
    		return f(x + 1, y, p + 1) or f(x, y + 1, p + 1) or
    			   f(x * 2, y, p + 1) or f(x, y * 3, p + 1) #Варианты действий
    	else:
    		return f(x + 1, y, p + 1) and f(x, y + 1, p + 1) and
    			   f(x * 2, y, p + 1) and f(x, y * 3, p + 1) #Варианты действий
    
    
    for s in range (1, 58 + 1): #Перебор S
    	if f(10, s, 1): #Начали с 10 камней
    		print(s)

    Ну и всего лишь 2 отличия:

    1. Позиции 3 или 5, а не 4, так как выиграл Ваня

    2. На второй ход выигрывает Ваня и нам нужно or и and поменять. Я заменил только кратность 2.

    Задача 22

    Ctrl+C, Ctrl+V — наше всё! :)

    for i in range(1, 100000):
    	x = i
    	L = 0
    	M = 0
    	while x > 0 :
    		L = L+1
    		if (x % 2) != 0:
    			M = M + x % 8
    		x = x // 8
    	if L == 3 and M == 6:
    		print(i)

    Задача 23

    Итак, код:

    def f(x, y):
    	if x > y: #Перегнали цель
    		return 0
    	if x == y:  #Догнали цель
    		return 1
    	if x < y: #Догоняем цель тремя методами
    		return f(x + 1, y) + f(x + 2, y) + f(x * 2, y)
    
    print(f(3, 10) * f(10, 12)) #Прошло через 10, значит догнали 10 и от де догоняем 12

    Так как в условии задачи мы увеличиваем число, но будем числа «догонять». Три метода описаны, ну а пройти через 10 — значит дойти до него и идти от него.

    Собственно, это и есть вся первая часть ЕГЭ по информатике решённая на Python.

    Ссылка на репозиторий со всеми программами:

    Надеюсь, что смог помочь в своей статье выпускникам и готовящимся ;)

    Остался один вопрос — нужен ли разбор второй части ЕГЭ по информатике на Python? Оставлю этот вопрос на ваше голосование.

    Всем удачи!

    Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

    Делаю разбор второй части?

    Проголосовали 106 пользователей.

    Воздержались 15 пользователей.

    Разбор 16 задания на Python | ЕГЭ-2023 по информатике

    Канал видеоролика: Иван Викторович

    Разбор 16 задания на Python | ЕГЭ-2023 по информатике

    Смотреть видео:

    Свежая информация для ЕГЭ и ОГЭ по Информатике (листай):

    С этим видео ученики смотрят следующие ролики:

    Разбор 17 задания на Python | ЕГЭ-2023 по информатике

    Разбор 17 задания на Python | ЕГЭ-2023 по информатике

    Иван Викторович

    Разбор 8 задания на Python | ЕГЭ-2023 по информатике

    Разбор 8 задания на Python | ЕГЭ-2023 по информатике

    Иван Викторович

    Разбор 12 задания на Python | ЕГЭ-2023 по информатике

    Разбор 12 задания на Python | ЕГЭ-2023 по информатике

    Иван Викторович

    Разбор 2 задания ЕГЭ по информатике решение в pascal и python (2019 вариант 4, Крылов С.С., Чуркина)

    Разбор 2 задания ЕГЭ по информатике решение в pascal и python (2019 вариант 4, Крылов С.С., Чуркина)

    Светлана Майер

    Облегчи жизнь другим ученикам — поделись! (плюс тебе в карму):

    12.12.2022

    • Комментарии

    RSS

    Написать комментарий

    Нет комментариев. Ваш будет первым!

    Ваше имя:

    Загрузка…

    В заданиях #16, которые составляют малоизвестные личности мне часто встречаются задачи, в которых идёт переполнение стека (я вот сомневаюсь, что на экзамене для школьников может быть задание на рекурсию, которую рвёт на части даже если передать в неё ‘1’).
    Мне интересно, это ошибка составителя задания или это я что-то делаю не так.

    from functools import lru_cache
    from sys import setrecursionlimit
    
    setrecursionlimit(3000)
    
    
    @lru_cache()
    def F(n: int):
        if n >= 10000:
            return n
        elif n % 2:
            return F(n + 2) + 1
        else:
            return F(n + 2) - 3
    
    
    print(F(4))
    

    Задание

    задан 11 дек 2022 в 5:19

    Денис Буковский's user avatar

    1

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

    F(94) = F(96) - 3 = F(98) - 6 …
    F(80) = F(82) - 3 = F(84) - 6 …
    

    Очевидно, что с нечётным n мы никогда не столкнёмся, тогда имеем:

    F(94) - F(80) = (F(10000) - ((10000-94)/2) * 3) - (F(10000) - ((10000 - 80))/2 * 3)) =
    (10000 - 14859) - (10000 - 14880) = 21
    

    ответ дан 11 дек 2022 в 5:43

    Павел's user avatar

    ПавелПавел

    4,2244 золотых знака9 серебряных знаков34 бронзовых знака

    1

    Понравилась статья? Поделить с друзьями:
  • Решение 15 задания егэ по информатике онлайн
  • Решение 15 задания егэ математика профиль видео
  • Решение 15 задания егэ информатика отрезки
  • Решение 15 задания егэ информатика 2022 презентация
  • Решение 15 задания егэ информатика 2022 на питоне