16 задание егэ информатика на питоне с двумя функциями

Шестнадцатое задание из ЕГЭ по информатике 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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    Разбор 24 задания ЕГЭ по информатике демо 2021 и с сайта Полякова К. (21) , на Pascal и Python

    Разбор 24 задания ЕГЭ по информатике демо 2021 и с сайта Полякова К. (21) , на Pascal и Python

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

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

    12.12.2022

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

    RSS

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

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

    Ваше имя:

    Загрузка…

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

    Рекурсивные функции с возвращаемыми значениями

    Задание 6 (ИНФ-11 ЕГЭ 2023_ДЕМО)

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

    Вариант программы 1

    Лимит рекурсии по умолчанию в Python является 1000, вы получите ошибку « RecursionError: максимальная глубина рекурсии превышена в сравнении »
    Это может быть исправлено, увеличивая предел рекурсиона в Python, ниже – фрагмент о том, как вы можете увеличить предел рекурсии.

    import sys
    sys.setrecursionlimit(2030)

    Вариант программы 2

    Алгоритмы, опирающиеся на несколько предыдущих значений

    Задание 6 (Решу ЕГЭ)

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

    F(1) = 1

    F(2) = 1

    F(3) = 1

    F(n) = F(n–3) + F(n–2), при n >3, где n – натуральное число.

    Чему равно двенадцатое число в последовательности Падована?

    В ответе запишите только натуральное число.

    Задание 6 (Решу ЕГЭ)

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

    F(1) = 1;

    F(n) = n + F(n − 2), если n — нечётно, и n > 1;

    F(n) = n × F(n − 1), если n — чётно.

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

    Алгоритмы, опирающиеся на несколько предыдущих значений

    Задание 6 (Решу ЕГЭ)

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

    F(1) = 0

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

    G(1) = 1

    G(n) = G(n–1) * n, при n >1

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

    В ответе запишите только натуральное число.

    Сложные задачи

    Задание 6 (Поляков ЕГЭ)

    (№ 5604) (А. Куканова) Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
    F(n) = sqrt(n), если sqrt(n) – натуральное число,
    F(n) = F(n + 1) + 1, если sqrt(n) – дробное число.
    Чему равно значение выражения F(4850) + F(5000)?

    При делении натурального числа на 2 мы получаем в остатке (%) или 0 или 1 (чётные и нечётные числа), таким образом проверяем, если корень дает четное или нечётное целое число, то выводим корень этого числа во всех остальных случаях применяет функцию F(n+1)+1
    sqrt(n) запишем как n**0.5, что бы не подключать дополнительный математический модуль из библиотеки

    Задание 6 (Поляков ЕГЭ)

    Определите, сколько символов * выведет эта процедура при вызове F(140):

    Алгоритмы, опирающиеся на несколько предыдущих значений

    Задание 6 (Поляков ЕГЭ)

    (№ 5604) (А. Куканова) Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
    F(n) = n!, если n ≥ 5000,
    F(n) = 2 · F(n + 1) / (n + 1), если 1 ≤ n < 5000.
    Чему равно значение выражения 1000 · F(7) / F(4)?
    Примечание.
    Факториал числа n, который обозначается как n!, вычисляется по формуле n!=1·2·…·n.

    Модуль math – один из наиважнейших в Python. Этот модуль предоставляет обширный функционал для проведения вычислений с вещественными числами (числами с плавающей точкой).

    Для использования этих функций в начале программы необходимо подключить модуль, что делается командой import:
    # программный код
    import math
    num1 = math.sqrt(2) # вычисление корня квадратного из двух
    Как можно заметить из примера выше, для вызова функции мы вынуждены указывать название модуля и символ точки. С другой стороны, если функции используются достаточно часто, то такой вызов (постоянное указание названия модуля и символа точки) может усложнить программу и сделать её менее читабельной. Для того, чтобы не указывать название модуля и символ точки при вызове функций, мы пишем следующий код:

    # программный код
    from math import *
    Если нужно использовать только некоторые функции модуля, то мы можем импортировать только их следующим образом:
    from math import sqrt, ceil, factorial

    ещё не решила)

    Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями:
    F(n) = n + 15, при n ≤ 5
    F(n) = F(n//2) + n*n*n — 1, при чётных n > 5
    F(n) = F(n-1) + 2*n*n + 1, при нечётных n > 5
    Здесь // обозначает деление нацело. Определите количество натуральных значений n из отрезка [1; 1000], для которых значение F(n) содержит не менее двух цифр 8.
    Написал только сам алгоритм, как найти из них числа с 2-мя восьмерками

    Python
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    for x in range(1,1000):
        def f(n):
            if n <=5:
                return n+15
            if n % 2 == 0 and n > 5 :
                return f(n//2)+n**3-1
            if n % 2 !=0 and n > 5:
                return f(n-1)+2*n*n+1
        print(f(x))

    __________________
    Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь

    ЕГЭ информатика 16 задание разбор, теория, как решать.

    Рекурсивные алгоритмы, (П) — 1 балл

    Е16.28 Чему равно значение выражения F(2023) / F(2020)?

    Алгоритм вычисления значения функции F(n), где n – натуральное число, задан следующими соотношениями: F(n) = 1 при n = 1; F(n) = n × F(n − 1), если n > 1. Чему равно значение выражения F(2023) / F(2020)? Ответ:   Демонстрационный вариант ЕГЭ 2023 г.  – задание №16 

    Читать далее

    Е16.27 Укажите наименьшее значение a, для которого F(a, 0) = 1392781243

    Обозначим частное от деления целочисленного натурального числа a на натуральное число b как a div b, а остаток как a mod b. Например, 13 div 3 = 4, 13 mod 3 = 1. Алгоритм вычисления значения функции F(a, b), где a и b – целые неотрицательные числа, задан следующими соотношениями: F(0, b) = b; F(a, …

    Читать далее

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

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

    Читать далее

    Е16.25 Укажите количество таких значений n < 1 000 000 000, для которых F(n) = 2.

    Алгоритм вычисления значения функции F(n), где n – целое неотрицательное число, задан следующими соотношениями: F(0) = 0; F(n) = F(n – 1) + 1, если n нечётно; F(n) = F(n/2), если n > 0 и при этом n чётно. Укажите количество таких значений n < 1 000 000 000, для которых F(n) = 2. СтатГрад …

    Читать далее

    Е16.24 являющихся результатом вызова функции для значений n в диапазоне [40; 50]

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

    F(n) = n + 3, при n 3

    F(n) = F(n 2) + n, при n > 3 и четном значении F(n1),

    F(n) = F(n 2) + 2· n, при n > 3 и нечетном значении F(n1)

    Определите сумму значений, являющихся результатом вызова функции для значений n в диапазоне [40; 50]. Ответ:   Е. Джобс

    Читать далее

    Е16.23 F(n) = F(n – 1) – F(n – 2) + 3n, при n > 1 и n – четно

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

    F(0) = 1, F(1) = 3

    F(n) = F(n 1) F(n 2) + 3n, при n > 1 и n четно

    F(n) = F(n 2) F(n 3) + 2n, при n > 1 и n нечетно

    Чему равно значение функции F(40)? В ответе запишите только целое число Ответ:   Е. Джобс

    Читать далее

    Е16.22 Сколько существует таких чисел n, что 1 ≤ n ≤ 500 и F(n) = 8

    Алгоритм вычисления значения функции F(n), где n – целое неотрицательное число, задан следующими соотношениями: F(0) = 0; F(n) = F(n/2), если n > 0 и при этом n чётно; F(n) = 1 + F(n – 1), если n нечётно. Сколько существует таких чисел n, что 1 ≤ n ≤ 500 и F(n) = 8? Ответ: …

    Читать далее

    Е16.21 F(n) = 1 при n ≤ 1; F(n) = n · F(n – 1) при чётных n > 1;

    Алгоритм вычисления функции F(n) задан следующими соотношениями: F(n) = 1 при n ≤ 1; F(n) = n · F(n – 1) при чётных n > 1; F(n) = n + F(n – 2) при нечётных n > 1; Определите значение F(84). Ответ:   Тренировочный вариант от 16.11.2020 «Евгений Джобс»

    Читать далее

    Е16.20 для которых сумма цифр значения F(n) равна 27.

    Алгоритм вычисления функции F(n) задан следующими соотношениями: F(n) = n · n + 5 · n + 4, при n > 30 F(n) = F(n+1) + 3 · F(n+4), при чётных n ≤ 30 F(n) = 2 · F(n+2) + F(n+5), при нечётных n ≤ 30 Определите количество натуральных значений n из отрезка [1; 1000], …

    Читать далее

    Е16.19 F(0) = 0; F(n) = n + F(n – 3), если n > 0 и при этом n mod 3 = 0;

    F(0) = 0; F(n) = n + F(n – 3), если n > 0 и при этом n mod 3 = 0; F(n) = n + F(n – (n mod 3)), если n mod 3 > 0. Чему равно значение функции F(25)? Обозначим через a mod b остаток от деления натурального числа a на натуральное …

    Читать далее

    16 задание ЕГЭ информатика (Питон)

    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
    print(F(8))

    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 print(G(5))

    def F(n): if n > 0: G(n - 1) def G(n): print("*") if n > 1: F(n - 2) print(F(11))

    def F(n): if n == 0: return 0 if n % 2 == 0: return F(n//2) if n % 2 == 1: return 1 + F(n-1) p=0 for i in range (1,1001): if F(i)==3: p=p+1 print(p)

    f=[0]*1000000000 count=0 for i in range(1,len(f)): if i%2==1: f[i]=f[i-1]+1 if f[i]==2: count+=1 else: f[i]=f[i//2] if f[i]==2: count+=1 print(count)

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

    • ?(0)=0;
    • ?(?)=?(?/3), если ?>0 и при этом ???(?,3)=0;
    • ?(?)=???(?,3)+?(?–???(?,3)), если ???(?,3)>0.

    Назовите минимальное значение ?, для которого ?(?)=11.

    def F(n):
        if n == 0:
            return 0
        elif n > 0 and n % 3 == 0:
            return F(n // 3)
        elif n % 3 > 0:
            return n % 3 + F(n - (n % 3))
    n = 0      # n — целое неотрицательное число
    while True:
        if F(n) == 11:
            print(n)
            break
        n += 1

    def g(n):
        if n//10%10==9:
            return n
        else:
            return n+10
        
    def f(x,y):
        if x==y:
            return 1
        if x>y or x==25:
            return 0
        if x<y:
            return f(x+1,y) +f(x*2,y) +f(x*3,y)
    
    print(f(3,12)*f(12,46))

    Понравилась статья? Поделить с друзьями:

    Новое и интересное на сайте:

  • 1535 результаты егэ
  • 1535 причин сдавать егэ
  • 1535 вступительные экзамены варианты
  • 1535 вступительные экзамены 7 класс математика
  • 1533 регистрация на экзамен

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии