Рекурсия на егэ по информатике

На уроке рассматривается решение 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 КЕГЭ-2021

    (соответствует за да нию № 11 ЕГЭ 2020)

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

    Проверяемые умения или способы действий: Строить информационные модели объектов, систем и процессов в
    виде алгоритмов.

    (повышенный уровень, время – 9 мин)

    Что нужно знать:

    Рекурсия[1]
    определение, описание, изображение какого-либо объекта или

    процесса внутри самого этого объекта или процесса,
    то есть ситуация, когда объект

    является частью самого
    себя.

    Рекурсия

    способ определения множества объектов через это же множество на

    основе заданных базовых
    случаев.

    Рекурсивная функция[2] (от
    лат. recursio — возвращение) — это числовая функция

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

    позволяет вычислять значения f(n) на
    основе значений f(n-1), f(n-2), …, подобно

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

    чтобы для некоторых n
    функция была определена нерекурсивно

    (например, для n
    = 0, 1
    ).

    Рекурсивно
    заданная функция определяет своё значение через обращение к себе

    самой с другими
    аргументами. При этом возможно два варианта:

    Конечная
    рекурсивная функция
    . Она задаётся таким образом, чтобы для
    любого

    конечного аргумента за конечное число рекурсивных
    обращений привести к одному из

    отдельно определённых частных случаев, вычисляемых
    без рекурсии. Классический

    пример:
    рекурсивно-определённый факториал целого неотрицательного числа:

    Бесконечная
    рекурсивная функция
    . Она задаётся в виде обращения к самой
    себе

    во всех случаях (по крайней мере, для некоторых из
    аргументов). Подобным образом

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

    Примером рекурсии в математике является числовая
    последовательность, заданная

    рекуррентной    формулой,   когда    каждый    следующий    член  последовательности

    вычисляется как результат функции от n предыдущих
    членов (например, числа

    Фибоначчи).

    Рекурсивные алгоритмы
    это вспомогательные алгоритмы, которые напрямую

    или через другие
    вспомогательные алгоритмы вызывают сами себя.

    В программировании рекурсия[3]
    вызов функции (процедуры) из неё же самой,

    непосредственно   (простая   рекурсия)   или         через
    другие функции (сложная или

    косвенная рекурсия),
    например, функция A вызывает функцию B, а функция
    B

    функцию A. Рекурсивная программа
    позволяет описать повторяющееся или даже

    потенциально   бесконечное   вычисление,   причём   без   явных   повторений  частей

    программы и
    использования циклов.

    Структурно
    рекурсивная
    функция на верхнем уровне всегда представляет собой

    команду ветвления (выбор одной из двух или
    более альтернатив в зависимости от

    условия (условий), которое в данном случае уместно
    назвать «условием прекращения

    рекурсии»),
    имеющую две или более альтернативные ветви, из которых хотя бы одна

    является   рекурсивной   и   хотя   бы   одна   —   терминальной.   Рекурсивная  ветвь

    выполняется, когда условие прекращения рекурсии ложно,
    и содержит хотя бы один

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

    Терминальная
    ветвь выполняется, когда условие прекращения рекурсии истинно; она

    возвращает   некоторое   значение,   не   выполняя   рекурсивного   вызова.  Правильно

    написанная
    рекурсивная функция должна гарантировать, что через конечное число

    рекурсивных
    вызовов будет достигнуто выполнение условия прекращения рекурсии, в

    результате   чего   цепочка   последовательных   рекурсивных   вызовов   прервётся  и

    выполнится возврат.

    Помимо функций, выполняющих один
    рекурсивный вызов в каждой рекурсивной

    ветви, бывают случаи «параллельной рекурсии»,
    когда на одной рекурсивной ветви

    делается два или более рекурсивных вызова.
    Параллельная рекурсия типична при

    обработке сложных
    структур данных, таких как деревья.

    Основной недостаток
    рекурсии
    повторные вычисления одних и
    тех же значений.

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

    Рекуррентное
    соотношение
    – это запись, позволяющая вычислить следующее
    значение последовательности через значения предыдущих
    .

    Для того, чтобы
    рекурсивный алго ритм имел завершение, требуется, чтобы его параметр
    изменялся в процессе исполне ния и чтобы было явно написано условие
    завершения рекурсии.

    В рекуррентном соот
    ношении обязательным является указание значения для первого (начального)
    элемента последовательности.

    Рекомендации:

    Задание
    выполняется на компьютере либо посредством написа ния рекурсивного

    алгоритма   в   одной   из   систем   программирования,   либо   организацией  цепочки

    вычислений в электронных
    таблицах
    .

    Информационные ресурсы:

    1.    
    Теория:
    Интерактивный плакат «Фракталы» http://elementy.ru/posters/fractals;

    Запись вспомогательных алгоритмов на языке Паскаль;
    Функции;

    Рекурсия в
    Python
    ; Программирование на python: Теоретический материал (Рекурсия)

    2.     Задания
    для тренировки:
    ЕГЭ−2021, Информатика: задания, ответы, решения. Обучающая
    система Дмитрия Гущина

    3.     Онлайн-тест
    Константина Полякова для подготовки к ЕГЭ:

    16 —
    Рекурсивные алгоритмы (Паскаль).

    16 — Рекурсивные алгоритмы (Python).

    16 — Рекурсивные алгоритмы (C++).

    За да ние № 16 (ДЕМО ФИПИ КЕГЭ-2021)

    Алгоритм
    вычисления значения функции 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)?

    Решение:

    I вариант – решение в
    электронных таблицах:

    1.
    Составим     таблицу      для    n = 1÷26.    Введем       в        ячейки
    B2,
    C2
    и
    D2
    формулы
    соответствующие заданным рекуррентным соотношениям:

    2. С
    помощью автозаполнения копируем формулы из диапазона
    C2:D2 в E2:AA2

    II вариант – решение на
    Python:

    Ответ:
    4122

    За да ние № 16 (ЕГЭ−2021. Досрочная волна)

    Алгоритм
    вычисления значения функции 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(24)?

    Решение:

    I     
    вариант – решение в электронных таблицах:

    1.     Составим    таблицу      для    n
    = 1÷24.    Введем       в        ячейки
    B2, C2
    и
    D2
    формулы
    соответствующие заданным рекуррентным соотношениям:

    2.     С
    помощью автозаполнения копируем формулы из диапазона
    C2:D2 в
    E2:Y2

    II  
    вариант – решение на Python:

    Ответ: 2072

    Разбор заданий №16. Готовимся к
    итоговой аттестации 2021. Лещинер, В.Р.
    [4]Вариант № 1

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

    следующими
    соотношениями:

          F(n) =
    1                                при n = 1;

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

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

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

    Решение:

    I     
    вариант – решение в электронных таблицах:

    1.     Составим    таблицу      для    n
    = 1÷18.    Введем       в        ячейки
    B2, C2
    и
    D2
    формулы
    соответствующие заданным рекуррентным соотношениям:

    2.     С
    помощью автозаполнения копируем формулы из диапазона
    C2:D2 в
    E2:S2

    II  
    вариант – решение на Python:

    Ответ:
    6597

    Вариант № 2

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

    следующими
    соотношениями:

          F(n) =
    1                                при n = 1;

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

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

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

    Решение:

    I     
    вариант – решение в электронных таблицах:

    1.     Составим    таблицу      для    n
    = 1÷20.    Введем       в        ячейки
    B2, C2
    и
    D2
    формулы
    соответствующие заданным рекуррентным соотношениям:

    2.     С
    помощью автозаполнения копируем формулы из диапазона
    C2:D2 в
    E2:U2

    II  
    вариант – решение на Python:

    Ответ:
    19743

    Задание № 16.1

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

    следующими
    соотношениями:

    F(n) = 1 при
    n ≤ 2;

    F(n) = F(n — 1) + 2 × F(n — 2) при
    n > 2.

    Чему равно значение функций F(7),
    F(12), F(17)
    ?

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

    Решение:

    I вариант – решение в
    электронных таблицах:

    1.
    Составим     таблицу      для    n = 1÷17.    Введем       в        ячейки
    B2,
    C2
    и
    D2
    формулы
    соответствующие заданным рекуррентным соотношениям:

    2. С помощью автозаполнения
    копируем формулы из ячейки
    D2 в диапазон E2:R2

    II вариант – решение на
    Python:

    Ответ:
    43, 1365, 43691

    Задание № 16.2

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

    следующими
    соотношениями:

    F(n) = 2 при п ≤ 2;

    F(n) = F(n — 1) + 3 ×
    F(n — 2) при п > 2.

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

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

    Решение:

    I вариант – решение в
    электронных таблицах:

    1.
    Составим     таблицу      для    n = 1÷15.    Введем       в        ячейки
    B2,
    C2
    и
    D2
    формулы
    соответствующие заданным рекуррентным соотношениям:

    2. С помощью автозаполнения
    копируем формулы из ячейки
    D2 в диапазон E2:P2

    II вариант – решение на
    Python:

    Ответ: 38, 2318, 150632

    Задание № 16.3

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

    следующими
    соотношениями:

    F(n) = n  при п ≤ 2;

    F(n) = F(n — 1) + 3 ×
    F(n — 2) при п > 2.

    Чему равно значение функции F(6),
    F(12), F( 18)
    ?

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

    Решение:

    I вариант – решение в
    электронных таблицах:

    1.
    Составим     таблицу      для    n = 1÷18.    Введем       в        ячейки
    B2,
    C2
    и
    D2
    формулы
    соответствующие заданным рекуррентным соотношениям:

    2. С помощью автозаполнения копируем формулы из
    ячейки D2 в диапазон E2:S2

    II вариант – решение на
    Python:

    Ответ: 59, 8843, 1318811

    Задание № 16.4

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

    следующими
    соотношениями:

    F(n) = n + 1  при п ≤ 2;

    F(n) = F(n — 1) + 2 ×
    F(n — 2) при п > 2.

    Чему равно значение функции F(4),
    F(9), F( 14)
    ?

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

    Решение:

    I вариант – решение в
    электронных таблицах:

    1.
    Составим     таблицу      для    n = 1÷14.    Введем       в        ячейки
    B2,
    C2
    и
    D2
    формулы
    соответствующие заданным рекуррентным соотношениям:

    2. С помощью автозаполнения копируем формулы из
    ячейки D2 в диапазон E2:O2

    II вариант – решение на
    Python:

    Ответ: 13, 427, 13653

    За да ние № 11 (ДЕМО ЕГЭ-2020 ФИПИ)

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

    Бейсик

    Python

    С++

    SUB F(n)

    PRINT n,

    IF n >= 3 THEN

    F(n 2)

    F(n — 1)

    END IF

    END SUB

    def F(n):
    print(n, end=») if n >= 3:

    F(n // 2)

    F(n — 1)

    void F(int n) { std::cout << n; if (n
    >= 3) {

    F(n / 2);

    F(n — 1);

    }

    }

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

    Паскаль

    алг
    F(цел n) нач вывод n
    если n >= 3 то

    F(div(n, 2))

    F(n
    — 1) все кон

    procedure
    F(n: integer); begin write(n); if n >= 3 then begin

    F(n div 2);

    F(n
    — 1) end end;

    Запишите подряд
    без пробелов и разделителей все числа, которые будут выведены на

    экран при выполнении
    вызова F(5). Числа должны быть записаны в том же порядке, в

    котором они выводятся
    на экран.

    Решение:

    f(5)

    5

    >= 3 – yes

    f(div(5,2))

    2

    >= 3 – not

    f(5 — 1)

    4

    >= 3 – yes

    f(div(4,2))

    2

    >= 3 – not

    f(4-1)

    3

    >= 3 – yes

    f(div(3,2))

    1

    >= 3 – not

    f(3-1)

    2

    >= 3 – not

    Ответ:

    5

    24

    23

    12

    Ответ: 5242312

    За да ние № 11 (ДЕМО ЕГЭ-2019 ФИПИ)

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

    Бейсик

    Python

    С++

    SUB F(n)

    IF n > 0 THEN

    F(n — 1) PRINT n

    F(n — 2)

    END IF

    END SUB

    def F(n):

    if n > 0:

    F(n — 1) print(n) F(n — 2)

    void
    F(int n) { if (n > 0){ F(n — 1); std::cout << n; F(n — 2);

    }

    }

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

    Паскаль

    алг F(цел n)

    нач

    если n > 0 то
    F(n — 1) вывод n

    F(n — 2) все кон

    procedure F(n: integer); begin if
    n > 0 then begin F(n — 1); write(n);

    F(n — 2) end end;

    Запишите подряд
    без пробелов и разделителей все числа, которые будут выведены на

    экран при выполнении
    вызова F(4). Числа должны быть записаны в том же порядке, в

    котором они выводятся
    на экран.

    Решение:

    n=4

    f(4)

    4

    f(4-2)

    2

    f(2-2)

    F(n — 1)
    PRINT n

    F(n — 2)

    f(3)

    3

    f(3-2)

    1

    f(1-2)

    f(1)

    1

    f(2)

    2

    f(2-2)

    f(1-1)

    f(0)

    f(1)

    1

    f(1-2)

    f(0)

    Ответ:

    1

    2

    3

    1

    4

    1

    2

    Ответ: 1231412

    За да ние № 11 (ДЕМО ЕГЭ-2018 ФИПИ)

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

    Бейсик

    Python

    С++

    SUB F(n)

    IF n > 0 THEN

    PRINT n

    F(n — 3)

    F(n 3)

    END IF

    END SUB

    def F(n):

    if n >
    0: print(n) F(n — 3)

    F(n // 3)

    void
    F(int n) { if (n > 0){ F(n — 1); std::cout << n; F(n — 2);

    }

    }

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

    Паскаль

    алг F(цел n)

    нач

    если n > 0 то
    вывод n

    F(n — 3)

    F(div(n, 3)) все кон

    procedure F(n: integer); begin if
    n > 0 then begin write(n); F(n — 3);

    F(n div 3) end end;

    Запишите подряд
    без пробелов и разделителей все числа, которые будут выведены на

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

    котором они выводятся
    на экран.

    Решение:

    f(9)

    9

    f(div(6, 3))

    3

    f(9-3)

    6

    f(div(6, 3))

    2

    f(3-3)

    f(6-3)

    3

    f(div(3, 3))

    1

    f(2-3)

    f(div(3,3))

    1

    f(3-3)

    f(1-3)

    f(1-3) f(div(1,3))

    Ответ:

    9

    6

    3

    1

    2

    3

    1

    Ответ: 9631231


    Пройти тестирование по этим заданиям
    Вернуться к каталогу заданий

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

    1

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

    Бейсик Python

    SUB F(n)

        PRINT n

        IF n < 5 THEN

            F(n + 1)

            F(n + 3)

        END IF

    END SUB

    def F(n):

        print(n)

        if n < 5:

            F(n + 1)

            F(n + 3)

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

    procedure F(n: integer);

        begin

            writeln(n);

            if n < 5 then

                begin

                    F(n + 1);

                    F(n + 3)

                end

        end

    алг F(цел n)

    нач

    вывод n, нс

    если n < 5 то

        F(n + 1)

        F(n + 3)

    все

    кон

    С++

    void F(int n)

    {

        cout << n << endl;

        if (n < 5) {

            F(n + 1);

            F(n + 3);

        }

    }

    Чему равна сумма всех чисел, напечатанных на экране при выполнении вызова F(1)?

    Источник: Демонстрационная версия ЕГЭ—2015 по информатике.


    2

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

    Бейсик Python

    SUB F(n)

        PRINT n

        IF n > 0 THEN

            F(n — 1)

            F(n — 3)

         END IF

    END SUB

    def F(n):

        print(n)

        if n > 0:

            F(n — 1)

            F(n — 3)

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

    procedure F(n: integer);

        begin

            writeln(n);

            if n > 0 then

                begin

                    F(n — 1);

                    F(n — 3)

                end

    end

    алг F(цел n)

    нач

    вывод n, нс

    если n > 0 то

        F(n — 1)

        F(n — 3)

    все

    кон

    Си

    void F(int n)

    {

        cout << n;

        if (n > 0)

        {

            F(n — 1);

            F(n — 3);

        }

    }

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


    3

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

    Бейсик Python

    SUB F(n)

        PRINT n

        IF n > 1 THEN

            F(n — 1)

            F(n — 3)

        END IF

    END SUB

    def F(n):

        print(n)

        if n > 1:

            F(n — 1)

            F(n — 3)

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

    procedure F(n: integer);

        begin

            writeln(n);

            if n > 1 then

                begin

                    F(n — 1);

                    F(n — 3)

                end

        end

    алг F(цел n)

    нач

    вывод n, нс

    если n > 1 то

        F(n — 1)

        F(n — 3)

    все

    кон

    C++

    void F(int n)

    {

        cout << n;

        if (n > 1)

        {

            F(n — 1);

            F(n — 3);

        }

    }

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


    4

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

    Бейсик Python

    SUB F(n)

        PRINT n

        IF n < 5 THEN

            F(n + 1)

            F(n + 2)

        END IF

    END SUB

    def F(n):

        print(n)

        if n < 5:

            F(n + 1)

            F(n + 2)

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

    алг F(цел n)

    нач

        вывод n, нс

        если n < 5 то

            F(n + 1)

            F(n + 2)

        все

    кон

    procedure F(n: integer);

    begin

        writeln(n);

        if n < 5 then

        begin

            F(n + 1);

            F(n + 2)

        end

    end

    Си

    void F(int n)

    {

        cout << n;

        if (n < 5)

        {

            F(n + 1);

            F(n + 2);

        }

    }

    Чему равна сумма всех чисел, напечатанных на экране при выполнении вызова F(2)?


    5

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

    Бейсик Python

    SUB F(n)

        PRINT n

        IF n < 4 THEN

            F(n + 1)

            F(n + 3)

        END IF

    END SUB

    def F(n):

        print(n)

        if n < 4:

            F(n + 1)

            F(n + 3)

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

    алг F(цел n)

    нач

        вывод n, нс

        если n < 4 то

            F(n + 1)

            F(n + 3)

        все

    кон

    procedure F(n: integer);

    begin

        writeln(n);

        if n < 4 then

        begin

            F(n + 1);

            F(n + 3)

        end

    end

    Си

    void F(int n)

    {

        cout << n;

        if (n < 4)

        {

            F(n + 1);

            F(n + 3);

        }

    }

    Чему равна сумма всех чисел, напечатанных на экране при выполнении вызова F(1)?

    Пройти тестирование по этим заданиям

    Автор материалов — Лада Борисовна Есакова.

    Рекурсия — это способ определения объектов (понятий), при котором определение объекта строится, опираясь на само понятие объекта.

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

    — условие остановки рекурсии (базовый случай);

    — рекуррентную формулу.

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

    Некоторые языки программирования не содержат циклических конструкций вовсе, предоставляя программистам организовывать повторения с помощью рекурсии (например, Пролог, где рекурсия — основной прием программирования).

    Классическим примером рекурсивного алгоритма является описание вычисления факториала:

    где F(n-1)=(n-1)!

    Рекурсивные алгоритмы вычисления одной функции

    Пример 1.

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

    F(n) = 1 при n = 1;

    F(n) = F(n − 1) · n при n ≥ 2.

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

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

    Решение:

    По­сле­до­ва­тель­но на­йдём зна­че­ния функции от базового случая F(1) до искомого значения F(6):

    F(1) = 1

    F(2) = 2

    F(3) = 6

    F(4) = 24

    F(5) = 120

    F(6) = 720

    Ответ:720

    Рекурсивные алгоритмы вычисления нескольких функций

    Пример 2.

    Алгоритм вычисления значений функций 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)? В ответе запишите только целое число.

    Решение:

    По­сле­до­ва­тель­но на­йдём зна­че­ния функций от базового случая F(1), G(1) до искомых значений F(5), G(5):

    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

    Рекурсивные алгоритмы выполнения процедур

    Пример 3.

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

    Бей­сик

    Python

    SUB F(n)

    PRINT n

    IF n < 5 THEN

    F(n + 1)

    F(n + 3)

    END IF

    END SUB

    def F(n):

    print(n)

    if n < 5:

    F(n + 1)

    F(n + 3)

    Пас­каль

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

    procedure F(n: integer);

    begin

    writeln(n);

    if n < 5 then

    begin

    F(n + 1);

    F(n + 3)

    end

    end

    алг F(цел n)

    нач

    вывод n, нс

    если n < 5 то

    F(n + 1)

    F(n + 3)

    все

    кон

    Си

    void F(int n)

    {

    printf(«%dn», n);

    if (n < 5) {

    F(n + 1);

    F(n + 3);

    }

    }

    Чему равна сумма всех чисел, на­пе­ча­тан­ных на экра­не при вы­пол­не­нии вы­зо­ва F(1)?

    Решение:

    Выпишем последовательно все действия, которые выполнят запускаемые процедуры:

    F(1) выполнит следующие действия: Вывод числа 1, F(2), F(4)

    F(2) выполнит следующие действия: Вывод числа 2, F(3), F(5)

    F(4) выполнит следующие действия: Вывод числа 4, F(5), F(7)

    F(3) выполнит следующие действия: Вывод числа 3, F(4), F(6)

    F(5) выполнит следующие действия: Вывод числа 5

    F(5) выполнит следующие действия: Вывод числа 5

    F(7) выполнит следующие действия: Вывод числа 7

    F(4) выполнит следующие действия: Вывод числа 4, F(5), F(7)

    F(6) выполнит следующие действия: Вывод числа 6

    F(5) выполнит следующие действия: Вывод числа 5

    F(7) выполнит следующие действия: Вывод числа 7

    Просуммируем все числа, выведенные на экран: 1+2+4+3+5+5+7+4+6+5+7 = 49

    Ответ: 49

    Пример 4.

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

    1

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

    Решение:

    Выпишем последовательно все действия, которые выполнят запускаемые процедуры:

    F(11)  G(10) * F(7) G(6) * F(3) G(2) * F(-1)

    Всего на экране будет напечатано 3 «звездочки».

    Ответ: 3

    Пример 7.36.

    Дан рекурсивный алгоритм:

    procedure F(n: integer);

    begin

     writeln(‘*’);

     if n > 0 then begin

       F(n-3);

       F(n-2);

       F(n div 2);

       F(n div 2);

     end

    end;

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

    Решение:

    Для наглядности изобразим схему работы алгоритма в виде дерева:

    2

    Причем, распишем до конца каждое значение F(n)  только один раз. Например, расписав один раз F(1), мы видим, что она напечатает в результате 5 звездочек. Т.е. F(1) = 5.

    Проанализировав дерево, видим, что

    F(0) = 1

    F(2) = 3 + 2*F(1) = 13

    F(3) = 1 + F(0) + 3*F(1) = 1 + 1 + 15 = 17

    F(4) = 1 + F(1) + 3*F(2) = 1 + 5 + 3*13 = 45

    F(6) = 1 + 3*F(3) + F(4) = 1 + 3*17 + 45 = 46 + 51 = 97

    Ответ: 97

    Благодарим за то, что пользуйтесь нашими статьями.
    Информация на странице «Задача №11. Использование рекурсивных алгоритмов.» подготовлена нашими редакторами специально, чтобы помочь вам в освоении предмета и подготовке к ЕГЭ и ОГЭ.
    Чтобы успешно сдать необходимые и поступить в ВУЗ или техникум нужно использовать все инструменты: учеба, контрольные, олимпиады, онлайн-лекции, видеоуроки, сборники заданий.
    Также вы можете воспользоваться другими материалами из разделов нашего сайта.

    Публикация обновлена:
    09.03.2023

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

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

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

    Задание 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

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

    Алгоритмизация и программирование

    Алгоритмы, виды алгоритмов, описание алгоритмов. Формальное исполнение алгоритмов

    Термин «алгоритм», впервые употребленный в современном значении. Лейбницем (1646–1716), является латинизированной формой имени великого персидского математика Мухаммеда бен Муссы аль-Хорезми (ок. 783 – ок. 850). Его книга «Об индийском счете» в XII в. была переведена на латинский язык и пользовалась широкой популярностью не одно столетие. Имя автора европейцы произносили как Алгоритми (Algorithmi), и со временем так стали называть в Европе всю систему десятичной арифметики.

    Научное определение алгоритма дал А. Чёрч в 1930 году. В наше время понятие алгоритма является одним из основополагающих понятий вычислительной математики и информатики.

    Алгоритм — это точное и полное описание последовательности действий над заданными объектами, позволяющее получить конечный результат.

    Можно сказать, что алгоритм решения какой-либо задачи — это последовательность шагов реализации (или нахождения) этого решения, а процесс построения алгоритма (алгоритмизация) — разложение задачи на элементарные действия или операции.

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

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

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

    Основные требования, предъявляемые к алгоритмам:

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

    Определенность (детерминированность; лат. determinate — определенность, точность): шаги (операции) алгоритма должны допускать однозначную трактовку и быть понятными для исполнителя алгоритма. Это свойство указывает на то, что любое действие в алгоритме должно быть строго определено и описано для каждого случая.

    Массовость: алгоритм должен давать решение не только для конкретного набора значений, а для целого класса задач, который определяется диапазоном возможных исходных данных (область применимости алгоритма). Свойство массовости подразумевает использование переменных в качестве исходных данных алгоритма.

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

    Конечность: количество шагов алгоритма должно быть конечным.

    Эффективность: количество шагов и сами шаги алгоритма должны быть такими, чтобы решение могло быть найдено за конечное и, более того, приемлемое время.

    Для оценки и сравнения алгоритмов существует много критериев. Чаще всего анализ алгоритма (или, как говорят, анализ сложности алгоритма) состоит в оценке временных затрат на решение задачи в зависимости от объема исходных данных. Используются также термины «временная сложность», «трудоемкость» алгоритма. Фактически эта оценка сводится к подсчету количества основных операций в алгоритме, поскольку каждая из них выполняется за заранее известное конечное время. Кроме временной сложности, должна оцениваться также емкостная сложность, т. е. увеличение затрат памяти в зависимости от размера исходных данных. Оценка сложности дает количественный критерий для сравнения алгоритмов, предназначенных для решения одной и той же задачи. Оптимальным (наилучшим) считается алгоритм, который невозможно значительно улучшить в плане временных и емкостных затрат.

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

    Алгоритмы можно представлять как некоторые структуры, состоящие из отдельных базовых элементов.

    Логическая структура любого алгоритма может быть представлена комбинацией трех базовых структур:

    1. следование — образуется из последовательности действий, следующих одно за другим;
    2. ветвление (развилка) — обеспечивает в зависимости от результатов проверки условия (ДА или НЕТ) выбор одного из альтернативных путей алгоритма;
    3. цикл — обеспечивает многократное выполнение некоторой совокупности действий, которая называется телом цикла.

    Для описания алгоритмов наиболее распространены следующие методы (языки):

    Обычный язык. Изложение алгоритма ведется на обычном языке с разделением на последовательные шаги.

    Блок-схемы. Графическое изображение алгоритма с помощью специальных значков-блоков.

    Формальные алгоритмические языки (языки программирования). При записи алгоритмов используют строго определенный набор символов и составленных из них специальных зарезервированных слов. Имеют строгие правила построения языковых конструкций.

    Псевдокод. Синтез алгоритмического и обычного языков. Элементы некоторого базового алгоритмического языка используются для строгой записи базовых структур алгоритма.

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

    • строго не формализуемы;
    • достаточно многословны;
    • могут допускать неоднозначность толкования отдельных предписаний;
    • сложные задачи с анализом условий, с повторяющимися действиями трудно представляются в словесной или словесно-формульной форме.

    Графический способ представления информации является более наглядным и компактным по сравнению со словесным. При графическом представлении алгоритм изображается в виде последовательности связанных между собой функциональных блоков, каждый из которых соответствует выполнению одного или нескольких действий. Такое графическое представление алгоритма называется блок-схемой. Определенному типу действия (ввод/вывод данных, проверка условия, вычисление выражения, начало и конец алгоритма и т. п.) соответствует определенная геометрическая фигура — блочный символ. Блоки соединяются между собой линиями переходов, которые определяют очередность выполнения действий.

    Название символа Графическое изображение Комментарии
    Пуск/Останов (блоки начала и конца алгоритма) Указание на начало или конец алгоритма
    Ввод/Вывод данных (блоки ввода, вывода Организация ввода/вывода в общем виде
    Процесс (операторные блоки) Выполнение вычислительного действия или последовательности действий (можно объединять в один блок), которые изменяют значение, форму представления или размещение данных
    Условие (условный блок) Выбор направления выполнения алгоритма. Если условие, записанное внутри ромба, выполняется, то управление передается по стрелке «да», в противном случае — по стрелке «нет». Таким образом, реализуется процесс изменения последовательности вычислений в зависимости от выполнения условия
    Начало цикла с параметром Используется для организации циклических конструкций с известным количеством итераций (повторений) и известным шагом изменения параметра цикла. Внутри блока для параметра цикла указываются через запятую его начальное значение, конечное значение и шаг изменения. Цикл, для которого неизвестно количество повторений, записывается с помощью условного и операторных блоков
    Предопределенный процесс Используется для указания обращений к вспомогательным алгоритмам, существующим автономно в виде некоторых самостоятельных модулей, и для обращения к библиотечным подпрограммам
    Печать сообщений (документ) Вывод результатов на печать

    При составлении блок-схемы необходимо проверять выполнение следующих условий:

    1. из каждого прямоугольника и параллелограмма (кроме конца алгоритма) должна выходить только одна стрелка;
    2. в каждый прямоугольник и параллелограмм (кроме начала алгоритма) должна входить хотя бы одна стрелка;
    3. в каждый ромб должна входить хотя бы одна стрелка, а выходить из него — две стрелки, помеченные словами «ДА» и «НЕТ».

    Псевдокод занимает промежуточное положение между естественным языком и языками программирования. В псевдокоде не приняты строгие синтаксические правила для записи команд, что отличает формальные языки программирования. Однако в псевдокоде есть некоторые конструкции, которые присущи формальным языкам, что облегчает переход от записи алгоритма на псевдокоде к записи алгоритма на языке программирования. Псевдокоды бывают разные. Рассмотрим учебный (школьный) алгоритмический язык АЯ.

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

    алг — заголовок алгоритма нц — начало цикла знач
    нач — начало алгоритма кц — конец цикла и
    кон — конец алгоритма дано или
    арг — аргумент надо не
    рез — результат если да
    цел — целый то нет
    сим — символьный иначе при
    лит — литерный всё выбор
    лог — логический пока утв
    вещ — вещественный для ввод
    таб — таблица от вывод
    длин — длина до  

    Общий вид записи алгоритма на псевдокоде:

    алг — название алгоритма (аргументы и результаты)

    дано — условие применимости алгоритма

    надо — цель выполнения алгоритма

    нач — описание промежуточных величин

    последовательность команд (тело алгоритма)

    кон

    Часть алгоритма от слова алг до слова нач называется заголовком, а часть, заключенная между словами нач и кон,телом алгоритма (исполняемой частью алгоритма).

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

    Команды учебного языка:

    1. Оператор присваивания, который обозначается «:=» и служит для вычисления выражений, стоящих справа, и присваивания их значений переменным, указанным в левой части. Например, если переменная а имела значение 5, то после выполнения оператора присваивания а := а + 1, значение переменной а изменится на 6.

    2. Операторы ввода/вывода:

    ввод (список имен переменных)

    вывод (список вывода)

    Список вывода может содержать комментарии, которые заключаются в кавычки.

    3. Оператор ветвления (с использованием команды если…то… иначе…всё; выбор);

    4. Операторы цикла (с использованием команд для, пока, до).

    Запись алгоритма на псевдокоде:

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

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

    Для решения одной и той же задачи можно предложить несколько алгоритмов. Алгоритмы составляются с ориентацией на определенного исполнителя алгоритма. У каждого исполнителя имеется свой конечный набор команд, которые для него понятны и исполняемы. Этот набор называется системой команд исполнителя. Пользуясь системой команд, исполнитель может выполнить алгоритм формально, не вникая в содержание поставленной задачи. От исполнителя требуется только строгое выполнение последовательности действий, предусмотренной алгоритмом. Таким образом, в общем случае алгоритм претерпевает изменения по стадиям:

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

    Примеры решения задач

    Пример 1. Исполнитель Утроитель может выполнить только две команды, которым присвоены номера:

    1 — вычти 1;

    3 — умножь на 3.

    Первая команда уменьшает число на 1, вторая — увеличивает его втрое.

    Написать набор команд (не более пяти) получения из числа 3 числа 16. В ответе указать только номера команд.

    Решение.

    1 (3 – 1 = 2)

    3 (2 * 3 = 6)

    3 (6 * 3 = 18)

    1 (18 – 1 = 17)

    1 (17 – 1 = 16)

    Ответ: 13311

    Пример 2. Имеется Исполнитель алгоритма, который может передвигаться по числовой оси.

    Система команд Исполнителя алгоритма:

    1. «Вперед N» (Исполнитель алгоритма делает шаг вперед на N единиц).

    2. «Назад M» (Исполнитель алгоритма делает шаг назад на M единиц).

    Переменные N и M могут принимать любые целые положительные значения. Известно, что Исполнитель алгоритма выполнил программу из 50 команд, в которой команд «Назад 2» на 12 больше, чем команд «Вперед 3». Других команд в программе не было. Какой одной командой можно заменить эту программу, чтобы Исполнитель алгоритма оказался в той же точке, что и после выполнения программы?

    Решение.

    1. Найдем, сколько было команд «Вперед», а сколько «Назад». Учитывая, что общее количество команд равно 50 и что команд «Назад» на 12 больше, чем команд «Вперед». Получим уравнение: x + (x + 12) = 50, где x — количество команд «Вперед». Тогда общее количество команд «Вперед»: x = 19, а количество команд «Назад»: 19 + 12 = 31.

    2. Будем вести отсчет от начала числовой оси. Выполнив 19 раз команду «Вперед 3», Исполнитель алгоритма оказался бы на отметке числовой оси 57 (19 * 3 = 57). После выполнения 31 раз команды «Назад 2» (31 * 2 = 62) он оказался бы на отметке –5 (57 – 62 = –5).

    3. Все эти команды можно заменить одной — «Назад 5».

    Ответ: команда«Назад 5».

    Пример 3. Черепашка является исполнителем для создания графических объектов на рабочем поле. При движении Черепашка оставляет след в виде линии. Черепашка может исполнять следующие команды:

    Название команды Параметр Действия исполнителя
    вп Число шагов Продвигается в направлении головы на указанное число шагов
    нд Число шагов Продвигается в направлении, противоположном направлению головы на указанное число шагов
    пр Число градусов Поворачивается направо относительно направления, заданного головой черепашки
    лв Число градусов Поворачивается налево относительно направления, заданного головой черепашки

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

    Записать для исполнителя Черепашка алгоритмы:

    а) построения квадрата со стороной 100;

    б) построения правильного шестиугольника со стороной 50.

    в) построения изображения цифры 4, если голова Черепашки смотрит на север.

    Ответ: а) Повтори 4 [вп 100 пр 90]; б) Повтори 6 [вп 50 пр 360/6]; в) вп 100; повтори [лв 135 вп 50].

    Пример 4. Два игрока играют в следующую игру (это вариант восточной игры). Перед ними лежат три кучки камней, в первой из которых 2, во второй — 3, в третьей — 4 камня. У каждого игрока неограниченно много камней. Игроки ходят по очереди. Ход состоит в том, что игрок или удваивает число камней в одной из кучек, или добавляет по два камня в каждую из них. Выигрывает игрок, после хода которого либо в одной из кучек становится не менее 15 камней, либо общее число камней в трех кучках становится не менее 25. Кто выиграет при безошибочной игре обоих игроков — игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть первый ход выигрывающего игрока? Ответ следует обосновать.

    Решение. Удобнее всего составить таблицу возможных ходов обоих игроков. Заметим, что в каждом случае возможны всего четыре варианта хода. В таблице курсивом выделены случаи, которые сразу же приносят поражение игроку, делающему этот ход (например, когда камней в какой-либо кучке становится больше или равно 8, другой игрок непременно выигрывает следующим ходом, удваивая количество камней в этой кучке). Из таблицы видно, что при безошибочной игре обоих игроков первый всегда выиграет, если первым ходом сделает 4, 5, 6. У второго игрока в этом случае все ходы проигрышные.

      1-й ход 2-й ход
    Начало 1-й игрок 2-й игрок 1-й игрок 2-й игрок
    2,3,4 4,3,4 8,3,4 выигрыш  
    4,6,4 8,6,4 выигрыш
    4,12,4 выигрыш
    4,6,8 выигрыш
    6,8,6 выигрыш
    4,3,8 выигрыш  
    6,5,6 12,5,6 выигрыш
    6,10,6 выигрыш
    6,5,12 выигрыш
    8,7,8 выигрыш
      2,6,4 4,6,4 8,6,4 выигрыш
    4,12,4 выигрыш
    4,6,8 выигрыш
    6,8,6 выигрыш
    2,12,4 выигрыш  
    2,6,8 выигрыш
    4,8,6 выигрыш
    2,3,8 выигрыш    
    4,5,6 8,5,6 выигрыш  
    4,10,6 выигрыш
    4,5,12 выигрыш
    6,7,8 выигрыш

    Пример 5. Записано 7 строк, каждая из которых имеет свой номер. В нулевой строке после номера записана цифра 001. Каждая последующая строка содержит два повторения предыдущей строки и добавленной в конец большой буквы латинского алфавита (первая строка — A, вторая строка — B и т. д.). Ниже приведены первые три строкиєтой записи (в скобках указан номер строки):

    (0) 001

    (1) 001001A

    (2) 001001A001001AB

    Какой символ находится в последней строке на 250-м месте (считая слева направо)?

    Примечание. Первые семь букв латинского алфавита: A, B, C, D, E, F, G.

    Решение. Найдем длину каждой строки. Длина каждой следующей строки в два раза больше длины предыдущей плюс один символ, длина строк составит:

    (0) 3 символа;

    (1) 32+1=7;

    (2) 72+1=15;

    (3) 152+1=31;

    (4) 312+1=63;

    (5) 632+1=127;

    (6) 1272+1=255 символов.

    Так как задано 7 строк, а нумерация начинается с нулевой строки, последняя строка имеет номер 6 и содержит 255 символов. Последний символ в строке — F. Предпоследний элемент — E, далее идут символы D, C, B, A, 1 (по правилу формирования строк). Таким образом, 250-й символ — это 1.

    Ответ: 1.

    Пример 6. Имеется фрагмент алгоритма, записанный на учебном алгоритмическом языке:

    n := Длина(а)

    k = 2

    b := Извлечь(а, k)

    нц для i от 7 до n – 1

    с := Извлечь(а, i)

    b := Склеить(b, с)

    кц

    Здесь переменные а, b, с — строкового типа; переменные n, i — целые.

    В алгоритме используются следующие функции:

    Длина(х) — возвращает количество символов в строке х. Имеет тип «целое».

    Извлечь(х, i) — возвращает i-й символ слева в строке х. Имеет строковый тип.

    Склеить(х, у) — возвращает строку, в которой находятся все символы строки х, а затем все символы строки у. Имеет строковый тип.

    Какое значение примет переменная b после выполнения этого фрагмента алгоритма, если переменная а имела значение «ВОСКРЕСЕНЬЕ»?

    Решение. Находим общее число символов в строке а, получим, что n = 11.

    Выполняя команду b := Извлечь(а, k) при k = 2, получим, что b примет значение «О«.

    В цикле последовательно, начиная с 7-го символа строки а и заканчивая предпоследним (n – 1), извлекаем символ из строки а и присоединяем к строке b.

    В результате получим слово «ОСЕНЬ» (символы с номерами 2 + 7 + 8 + 9 + 10).

    Ответ: «ОСЕНЬ«

    Пример 7. Леонардо из Пизы, известный как Фибоначчи, был первым из великих математиков Европы позднего Средневековья. Числовой ряд, который называется его именем, получился в результате решения задачи о кроликах, которую Фибоначчи изложил в своей «Книге Абака», написанной в 1202 году. Он выглядит так:

    1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,…

    В этом ряду каждое следующее число, начиная с третьего, равно сумме двух предыдущих. Составить словесный алгоритм и блок-схему проверки принадлежности введенного числа n ряду Фибоначчи.

    Решение. Словесный алгоритм:

    1. Ввести число n.
    2. Установить значение первых трех чисел Фибоначчи: 1, 1, 2 (сумма двух предыдущих чисел).
    3. Пока введенное число n больше очередного числа Фибоначчи, взять два последних числа Фибоначчи и получить из них новое число Фибоначчи.
    4. Если число Фибоначчи равно введенному n или было введено число n = 1, значит, что было введено число Фибоначчи, в противном случае — введенное число не является числом Фибоначчи.

    Приведенный словесный алгоритм в пункте 1, 2 содержит начальные установки, в пункте 3 — цикл с условием, а пункт 4 — это вывод результата работы алгоритма.

    Блок-схема алгоритма:

    Обозначения:

    F — текущее число ряда Фибоначчи;

    F1 и F2 — два предыдущих числа ряда Фибоначчи для числа F;

    n — число, для которого требуется определить, является ли оно числом из ряда Фибоначчи.

    Использование основных алгоритмических конструкций: следование, ветвление, цикл

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

    Базовая структура СЛЕДОВАНИЕ указывает на то, что управление передается последовательно от одного действия к другому.

    Учебный алгоритмический язык Язык блок-схем
    действие 1
    действие 2

    действие n

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

    В качестве примера рассмотрим решение простой задачи.

    Пример. Найти y(x) = x2 + 3x + 5, используя только операции умножения и сложения.

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

    Порядок вычисления y(x) в первом случае — обычный, а во втором — (x + 3) x + 5. Обе формулы эквивалентны, но в первом случае для вычисления необходимо 2 умножения, 2 сложения и 3 переменных (x, y, z), а во втором используются 1 умножение, 2 сложения и 2 переменные (x, y).

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

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

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

    В операторах присваивания используется либо привычный знак равенства, либо сочетание двоеточия и знака равенства «:=». Поскольку знак присваивания — это не знак равенства, возможны записи вида Х := Х + 1 или А := А – В. Нужно учитывать, что оператор присваивания будет выполняться только в том случае, если значения всех переменных правой части уже определены.

    Базовая структура ВЕТВЛЕНИЕ (РАЗВИЛКА) используется в случае, когда выполнение программы может измениться в зависимости от результата проверки условия и пойти двумя разными (альтернативными) путями. Другими словами, условие является некоторым высказыванием (предикатом) и может быть истинным или ложным (принимать значение TRUE или FALSE). Каждый из путей ведет к общему выходу, так что работа алгоритма будет продолжаться независимо от того, какой путь будет выбран.

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

    Важную роль в операторах ветвления играют содержащиеся в них условия. В простейшем случае условиями служат отношения между величинами. Условия с одним отношением называют простыми условными выражениями, или простыми условиями. В некоторых задачах необходимы более сложные условия, состоящие из нескольких простых, например условие А < X < С, т. е. Х < А и (Х > C) (возможна запись (Х < А) and (Х > C)). Объединение нескольких простых условий в одно образует составное условное выражение, или составное условие. Составные условия образуются с помощью логических операторов not (отрицание), and (логическое И), or (логическое ИЛИ), хоr (исключающее ИЛИ).

    Структура ВЕТВЛЕНИЕ существует в четырех основных вариантах:

    если — то (неполная структура);

    если — то — иначе (полная структура);

    выбор (неполный);

    выбор — иначе (полный).

    Учебный алгоритмический язык Язык блок-схем
    1) если — то

    если условие

    то действие 1

    всё

    2) если — то — иначе

    если условие

    то действие 1

    иначедействие 2

    всё

    3) выбор

    выбор

    при условие 1: действие 1

    при условии 2: действие 2

    при условие N: действие N

    всё

    4) выбор — иначе

    выбор

    при условие 1: действие 1

    при условие 2: действие 2

    при условие N: действие N + 1

    иначе действия N + 1

    всё

    В качестве простого примера рассмотрим нахождение модуля числа y(x) = |x|. Решение приведено на рис. для случаев полной (а) и неполной (б) структур ветвления.

    Базовая структура ЦИКЛ служит для записи алгоритмов, в которых некоторая часть алгоритма (тело цикла) должна повторяться несколько раз. Количество повторений цикла может определяться разными способами, в зависимости от которых различают три вида циклов.

    1. Цикл с предусловием, или цикл «пока». При реализации этого цикла сначала проверяется условие его выполнения. Пока оно выполняется, будут происходить повторения тела цикла. Отсюда и другое его название — цикл «пока». Если условие не выполняется при первой проверке, то тело цикла не будет выполняться вообще. После выхода из цикла управление передается следующей структуре. Для того чтобы избежать зацикливания, т. е. бесконечного цикла, в теле цикла обязательно должны изменяться параметры, записанные в условии.

    Учебный алгоритмический язык Язык блок-схем

    нц

    пока условие

    тело цикла (последовательность действий)

    кц

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

    В операторах присваивания используется либо привычный знак равенства, либо сочетание двоеточия и знака равенства «:=». Поскольку знак присваивания — это не знак равенства, возможны записи вида Х := Х + 1 или А := А – В. Нужно учитывать, что оператор присваивания будет выполняться только в том случае, если значения всех переменных правой части уже определены.

    Базовая структура ВЕТВЛЕНИЕ (РАЗВИЛКА) используется в случае, когда выполнение программы может измениться в зависимости от результата проверки условия и пойти двумя разными (альтернативными) путями. Другими словами, условие является некоторым высказыванием (предикатом) и может быть истинным или ложным (принимать значение TRUE или FALSE). Каждый из путей ведет к общему выходу, так что работа алгоритма будет продолжаться независимо от того, какой путь будет выбран.

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

    Важную роль в операторах ветвления играют содержащиеся в них условия. В простейшем случае условиями служат отношения между величинами. Условия с одним отношением называют простыми условными выражениями, или простыми условиями. В некоторых задачах необходимы более сложные условия, состоящие из нескольких простых, например условие А < X < С, т. е. Х < А и (Х > C) (возможна запись (Х < А) and (Х > C)). Объединение нескольких простых условий в одно образует составное условное выражение, или составное условие. Составные условия образуются с помощью логических операторов not (отрицание), and (логическое И), or (логическое ИЛИ), хоr (исключающее ИЛИ).

    Структура ВЕТВЛЕНИЕ существует в четырех основных вариантах:

    если — то (неполная структура);

    если — то — иначе (полная структура);

    выбор (неполный);

    выбор — иначе (полный).

    Учебный алгоритмический язык Язык блок-схем
    1) если — то

    если условие

    то действие 1

    всё

    2) если — то — иначе

    если условие

    то действие 1

    иначедействие 2

    всё

    3) выбор

    выбор

    при условие 1: действие 1

    при условии 2: действие 2

    при условие N: действие N

    всё

    4) выбор — иначе

    выбор

    при условие 1: действие 1

    при условие 2: действие 2

    при условие N: действие N + 1

    иначе действия N + 1

    всё

    В качестве простого примера рассмотрим нахождение модуля числа y(x) = |x|. Решение приведено на рис. для случаев полной (а) и неполной (б) структур ветвления.

    Базовая структура ЦИКЛ служит для записи алгоритмов, в которых некоторая часть алгоритма (тело цикла) должна повторяться несколько раз. Количество повторений цикла может определяться разными способами, в зависимости от которых различают три вида циклов.

    1. Цикл с предусловием, или цикл «пока». При реализации этого цикла сначала проверяется условие его выполнения. Пока оно выполняется, будут происходить повторения тела цикла. Отсюда и другое его название — цикл «пока». Если условие не выполняется при первой проверке, то тело цикла не будет выполняться вообще. После выхода из цикла управление передается следующей структуре. Для того чтобы избежать зацикливания, т. е. бесконечного цикла, в теле цикла обязательно должны изменяться параметры, записанные в условии.

    Учебный алгоритмический язык Язык блок-схем

    нц

    пока условие

    тело цикла (последовательность действий)

    кц

    2. Цикл с параметром. Этот вид цикла удобно использовать в тех случаях, когда заранее извесно количество повторений цикла. Вводится понятие счетчика цикла, который по умолчанию считается равным либо 1, либо –1. В некоторых случаях изменение счетчика цикла (приращение) указывают явно. Для организации цикла необходимо задать верхнюю и нижнюю границы изменения счетчика цикла. В зависимости от значения верхней и нижней границы определяется шаг цикла (1 или −1), т. е. значение счетчика цикла.

    Учебный алгоритмический язык Язык блок-схем

    нц

    для i от i1 до i2

    тело цикла (последовательность действий)

    кц

    3. Цикл с постусловием, или цикл «до». При реализации этого цикла условие завершение цикла проверяется после тела цикла. В этом случае тело цикла всегда выполняется хотя бы один раз. Цикл будет выполняться до выполнения условия, отсюда и другое название — цикл «до». А пока условие не выполнено, будет повторяться тело цикла (выполнение условия, таким образом, является условием окончания цикла). В этом случае, как и в цикле «пока», необходимо предусмотреть в теле цикла изменение параметров условия цикла.

    Учебный алгоритмический язык Язык блок-схем

    нц

    тело цикла (последовательность действий)

    до условие

    кц

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

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

    Алгоритм, в состав которого входит итерационный цикл, называется итерационным алгоритмом. Итерационные алгоритмы используются при реализации итерационных численных методов. В итерационных алгоритмах необходимо обеспечить обязательное условие выхода из цикла (сходимость итерационного процесса). В противном случае произойдет зацикливание алгоритма, т. е. не будет выполняться основное свойство алгоритма — результативность.

    Пример. Вычислить сумму знакопеременного ряда $S=x-{x^2}/{2}+{x^3}/{3}-{x^4}/{4}+…$ с заданной точностью $ε$.

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

    Решение. Запишем блок-схему алгоритма, где будем использовать следующие обозначения:

    $S$ — частичная сумма ряда (стартовое значение равно 0);

    $ε$ — точность вычисления;

    $i$ — номер очередного слагаемого;

    $m$ — значение очередного слагаемого;

    $p$ — числитель очередного слагаемого.

    На псевдокоде алгоритм можно записать следующим образом:

    Примечание. Следует отметить, что ряд будет сходящимся только при выполнении условия 0 < х < 1.

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

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

    Пример. Вычислить сумму элементов для заданной матрицы (таблицы из 5 строк и 3 столбцов) А(5,3).

    Решение. Алгоритм решения задачи на псевдокоде:

    Основная часть блок-схемы нахождения суммы элементов матрицы будет иметь следующий вид:

    Здесь порядок выполнения вложенных циклов следующий: счетчик внутреннего цикла изменяется быстрее, т. е. для i = 1(внешний цикл), j пробегает значения 1, 2, 3 (внутренний цикл); далее i = 2, j опять пробегает значения 1, 2, 3 и т. д.

    Примеры решения задач

    Пример 1. Дан фрагмент блок-схемы некоторого алгоритма.

    Определить значение переменной А после выполнения фрагмента алгоритма.

    Какие исправления нужно внести, чтобы изменение значения переменной А происходило в обратном порядке?

    Как записать исходный алгоритм с помощью двух других видов цикла?

    Решение. Если представить пошаговое выполнение алгоритма в виде таблицы, получим:

    Начальные установки: A = 100000; N = 2
    1-я итерация A = 10000; N = 4
    2-я итерация A = 1000; N = 6
    3-я итерация A = 100; N = 8
    4-я итерация A = 10; N = 10
    5-я итерация, выполнилось условие выхода: N > 10 Ответ: А = 1; N = 12

    Таблица обратного хода изменения значения А будет иметь такой вид:

    Начальные установки: A = 1; N = 2
    1-я итерация A = 10; N = 4
    2-я итерация A = 100; N = 6
    3-я итерация A = 1000; N = 8
    4-я итерация A = 10000; N = 10
    5-я итерация, выполнилось условие выхода: N > 10 А = 100000; N = 12

    Блок-схема алгоритма примет такой вид:

    В алгоритме нужно изменить начальное значение А и операцию деления заменить операцией умножения. Счетчик N в данном случае изменять не нужно.

    В приведенной в условии блок-схеме используется цикл с предусловием. Для цикла с параметром блок-схема алгоритма будет иметь такой вид:

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

    Для цикла с постусловием блок-схема исходного алгоритма имеет такой вид:

    В данной схеме условие завершения цикла находится после тела цикла. Цикл, в отличие от цикла с предусловием, выполняется, пока значение условия ложно.

    Пример 2. Сколько раз выполнится тело цикла в программе?

    Q := 27; P := 36

    нц пока (div(Q, 5) = div(P, 7))

    Q := Q + 2

    P := P + 3

    кц

    Примечание. Результат функции div(X, Y) — целая часть от деления X на Y.

    Решение. Рассмотрим пошаговое выполнение алгоритма, оформив его в виде таблицы.

    Начальные установки Q := 27; P := 36
    Проверка выполнения условия div(27, 5) = 5;
    div(36, 7) = 5;
    5 = 5
    1-я итерация; выполнение тела цикла Q := 29; P := 39
    Проверка выполнения условия div(29, 5) = 5;
    div(39, 7) = 5;
    5 = 5
    2-я итерация; выполнение тела цикла Q := 31; P := 42
    Проверка выполнения условия div(31, 5) = 6;
    div(42, 7) = 6;
    6 = 6
    3-я итерация; выполнение тела цикла Q := 33; P := 45
    Проверка выполнения условия div(33, 5) = 6;
    div(45, 7) = 6
    6 = 6
    4-я итерация; выполнение тела цикла Q := 35; P := 48
    Проверка выполнения условия. Условие не выполняется, цикл завершает работу div(35, 5) = 7;
    div(48, 7) = 6;
    7 ≠ 6

    Ответ: цикл выполнится 4 раза.

    Использование переменных. Объявление переменной (тип, имя, значение).
    Локальные и глобальные переменные

    Величины служат для описания объектов и процессов в материальном мире. Каждая величина имеет некоторые характеристики. В программировании понятие величины несколько отличается от понятия величины в естественных науках — оно является более формальным. Величиной называют объект — переменную, с которым связывается определенное множество значений. Такому объекту присваивается имя — идентификатор. Понятие переменной в программировании сходно с понятием переменной в математике. Например, в алгебраическом равенстве C = F + 2B – 5 значение переменной С зависит от значений переменных F и B, указанных в правой части равенства. Например, при F = 2 и B = 6, С = 9. Такое же равенство можно записать в программе, например на языке программирования Бейсик: C = F + 2B – 5. В терминах языка программирования C, F и B — это идентификаторы (имена) переменных.

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

    Переменные величины в отличие от постоянных величин (констант) могут со временем менять свое значение. Константой называется величина, которая в ходе выполнения программы не меняет своего значения.

    Назначение программы состоит в обработке информации, при этом, конечно, основную роль играют переменные.

    Переменная характеризуется:

    • идентификатором;
    • типом;
    • значением.

    Каждая переменная имеет свой идентификатор, т. е. свое уникальное имя. Имя переменной показывает, в каком месте памяти компьютера она хранится, значение переменной считывается из указанного ее именем места в памяти. Двух переменных с одним именем в одном программном модуле (блоке) быть не должно. Примерами идентификаторов величин могут быть, например, следующие последовательности символов: a1, SUMMA, X_1, Y_1, My_program.

    Во многих языках программирования существуют некоторые ограничения на задания имен переменных. Имена составляются из букв и цифр; первой литерой должна быть буква. Знак подчеркивания «_» считается буквой, его удобно использовать, чтобы улучшить восприятие длинных имен переменных. Разумно давать переменным логически осмысленные имена, в соответствии с их назначением. Нельзя использовать в качестве имен зарезервированные (служебные) слова языка программирования.

    Тип переменной — это диапазон (набор) всех значений, которые может принимать данная переменная. Тип переменной определяет, какие операции для нее допустимы. Другими словами, тип переменной — это характеристика, которая для величины определяет:

    • необходимый размер памяти;
    • диапазон значений, которые может принимать величина;
    • возможные операции над величиной (подразумеваются действия относительно использования величин в выражениях);
    • формы представления величин (или формат представления величин).

    Стандартные типы — это числовые, литерные и логические типы.

    Числовой тип, к которому относятся целые и вещественные величины, позволяет оперировать с числами. Целые числа, которые в учебном алгоритмическом языке составляют тип цел, сверху ограничены положительным числом Nmax, а снизу — отрицательным числом Nmin. Значения Nmax и Nmin определяются объемом ячеек памяти, в которые записываются целые числа. Обычно для целых чисел выделяется два байта памяти, соответственно границы диапазона равны [Nmin = –32768 и Nmax = 32767]. Считается, что все операции с величинами типа цел выполняются по обычным правилам арифметики, за одним исключением: возможны две операции деления div и mod.

    Операция div обозначает целочисленное деление. При делении с точностью до целых чисел получается два результата — частное и остаток. Знак результата берется по обычным правилам, а полученный остаток игнорируется. Например:

    23 div 5 = 4;

    2 div 6 = 0;

    (–13) div 5 = –2;

    (–13) div (–5) = 2.

    Операция mod определяет остаток при делении двух целых чисел.

    Например:

    23 mod 5 = 3;

    2 mod 6 = 2;

    (–13) mod 5 = –3;

    (–13) mod (–5) = 3;

    8 mod 2 = 0.

    Целые числа чаще всего используются в простых арифметических выражениях и выступают в программах в качестве различных счетчиков и значений индексов.

    К другому числовому типу относятся вещественные (вещ) величины. Значения вещественных величин могут изображаться в форме с фиксированной запятой (например, 0,3333; 2,0; –4,567 и т. д.) и с плавающей запятой (например, 7,0102, 5,173*10–3 и т. д.).

    В отличие от целых чисел, действия с вещественными числами могут быть неточными — это связано с ошибками округлений. Объем памяти, который предоставляется для хранения значений вещественной переменной, — от 4 до 10 байтов (в зависимости от выбранного формата числа). Над числовыми величинами можно выполнять как арифметические операции, так и операции сравнения (>, <, >=, <=, =, ).

    Литерный тип, включающий символы и строки, дает возможность работать с текстом. Литерные величины — это произвольные последовательности символов: букв, цифр, знаков препинания, пробела и других специальных знаков (возможными символами могут быть символы таблицы ASCII). Литерные величины обычно заключаются в кавычки: «а», «В», «СТРОКА», «1_2_3». В учебном алгоритмическом языке литерные величины обозначаются как лит. В других языках программирования (например, в Паскале) различают символьный (char) и строковый (string) типы. Величины символьного типа состоят из одного символа и занимают в памяти всего 1 байт. Величины строкового типа представляют собой различные последовательности символов, которые предусмотрены кодовой страницей, установленной в компьютере. Длина строки может составлять от 0 до 255 символов. Над всеми литерными величинами возможны операции сравнения. С помощью отношений типа «a» < «b», «b» < «c», «c» < «d»,… выполняется упорядочение литерных величин (сортировка по возрастанию или убыванию).

    Еще одной операцией, характерной для символьных и строковых величин, является операция конкатенации (слияния): «a» + «b» = «ab».

    Логический тип позволяет определять логические переменные, которые могут принимать только два значения: истина (true) или ложь (false). Для представления логической величины достаточно одного бита, однако, поскольку место в памяти выделяется по байтам, логической величине отводится минимальная «порция» памяти — один байт. Над логическими величинами можно выполнять все стандартные логические операции.

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

    Оператор присваивания

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

    Д := 13;

    D1 := C;

    Х := Х + 1.

    В операторах присваивания используется либо обычный знак равенства, либо сочетание двоеточия и знака равенства «:=». Поскольку знак присваивания — это не знак равенства, возможны записи вида Х := Х + 1 или А := А – В. Нужно учитывать, что оператор присваивания будет выполняться только в том случае, если значения всех переменных в правой части уже определены и выполняется соответствие типов для правой и левой части оператора присваивания. Например, С := А > B выполнится только в том случае, если для переменной С определен булевский (логический) тип. Операция присваивания может быть применена к большинству типов величин. Однако для каждого из типов предусмотрен свой набор операций.

    Локальные, глобальные и общие переменные

    Каждая переменная характеризуется областью действия или областью видимости. По зоне видимости в языках программирования различают локальные и глобальные переменные. Первые доступны только конкретному подалгоритму (вспомогательному алгоритму, подпрограмме, модулю), вторые — всему алгоритму (программе). С распространением модульного и объектного программирования появились еще и общие переменные, доступные для определенных уровней иерархии подпрограмм.

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

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

    Примеры решения задач

    Пример 1. Значения заданных переменных А, В перераспределить таким образом, чтобы А и В поменялись значениями.

    Решение. Возможны два варианта решения:

    С использованием промежуточной переменной С Без использования дополнительной переменной
    C := A;
    A := B;
    B := C
    A := A + B;
    B := A – B;
    A := A – B

    Пример 2. Определить значение переменной A после выполнения фрагмента алгоритма:

    Решение. Оформим решение в виде таблицы.

    A B D Условие
    2 –2 10 да
    –4 –2 12 да
    8 –2 14 да
    –16 –2 16 да
    32 –2 18 да
    –64 –2 20 да
    128 –2 22 нет — окончание цикла

    Ответ: А = 128.

    Пример 3. Определить значение переменной S:

    A := –1; B := 1

    нц пока A + B < 10

    A := A + 1; B := B + A

    кц

    S := A * B

    Решение. Оформим решение в виде таблицы.

    A B A + B S
    –1 1 0  
    0 1 1  
    1 2 3  
    2 4 6  
    3 7 10 — условие выхода из цикла 21

    Ответ: S = 21.

    Пример 4. Записать последовательность операций присваивания (:=), которая позволит определить номера подъезда и этажа по номеру N квартиры девятиэтажного дома, считая, что на каждом этаже по 4 квартиры, а нумерация квартир начинается с первого подъезда.

    Решение.

    4 * 9 = 36 {количество квартир в подъезде}

    Х := (N – 1) div 36 + 1 {номер подъезда}

    N := N – (X – 1) * 36 { N ∊[1, 36] }

    Y := (N – 1) div 4 + 1 {номер этажа}

    Например, для квартиры с номером 150 получим:

    Х = (150 – 1) div 36 + 1 = 4 + 1 = 5;

    N = 150 – (5 – 1) * 36 = 6;

    Y = (6 – 1) div 4 + 1 = 2.

    Ответ: квартира с номером 150 находится в пятом подъезде, на втором этаже.

    Работа с массивами (заполнение, считывание, поиск, сортировка, массовые операции и др.)

    Величины числового, литерного, логического типов представляются одним значением и относятся к простым типам данных. Характерной особенностью простых типов является атомарность, т. е. они не могут вмещать элементы других типов. Типы данных, которые не удовлетворяют данному условию, называются структурированными, или составными. Например, массивы, записи, строки, множества, файлы. Структурированный тип характеризуется множеством элементов, из которых складываются данные этого типа. Элементы структурированного типа называются компонентами. В свою очередь компонента структурированного типа может принадлежать также к структурированному типу. Из простых данных сложные структуры могут получаться двумя способами:

    1. объединением однородных элементов данных;
    2. объединением разнородных элементов данных.

    В первом случае примером могут служить массивы, а во втором — записи.

    Информацию удобно представлять в виде таблиц. Наиболее привычными являются прямоугольные таблицы, т. е. таблицы, состоящие из строк и столбцов. В том числе таблицы, состоящие из единственной строки или единственного столбца, — линейные таблицы, имеющие одно «измерение».

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

    Массив

    Массив — это упорядоченный набор данных, имеющий одно имя и состоящий из фиксированного числа однотипных элементов.

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

    Количество элементов массива называется размерностью массива.

    Итак, массив характеризуется:

    • размерностью;
    • базовым типом элементов;
    • типом индекса (может быть только порядковым типом);
    • множеством значений для индекса.

    Массив может быть одномерным (вектор) и многомерным (матрица).

    Одномерный массив содержит одно измерение; каждый элемент массива обозначается идентификатором (именем) массива с индексом. Многомерный массив содержит n-е количество измерений; каждый элемент массива обозначается идентификатором массива для n индексов.

    Существует несколько способов заполнения массива данными:

    1. непосредственное присваивание значений элементам;
    2. заполнение массива произвольными элементами, случайными числами;
    3. ввод значений элементов с клавиатуры или чтение из файла.

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

    Примечание. Строковый тип данных напоминает одномерный массив, в котором элементами являются символы. К примеру, строку «МАМА КУПИЛА ХЛЕБ» можно рассматривать как одномерный массив из 16 символов (включая пробелы). Эту строку можно обозначить идентификатором (например, Novost) и пронумеровать все символы, считая их элементами массива: Novost (l)  = «М», … Novost (16) = «Б».

    Однако для работы с символьной информацией более гибким инструментом является не одномерный массив, а строка (string). Это связано с тем, что количество символов в строке, в отличие от массива, не фиксировано. Благодаря этому к строке можно без ограничений применять стандартные операции и функции, предназначенные для работы с текстом.

    Задачи, связанные с обработкой массивов, как и все задачи вообще, условно можно разделить на два вида:

    1. стандартные задачи;
    2. задачи, решение которых требует знания вспомогательных алгоритмов, специальных методов и приемов.

    Очевидно, что без умения решать задачи первых двух видов невозможно решать нестандартные задачи.

    Стандартные задачи обработки массивов

    Пример 1. В массиве А каждый элемент равен 0 или 1. Заменить все нули единицами и наоборот.

    Решение. Достаточно одного оператора присваивания в теле цикла:

    A[i] := 1 – A[i].

    Пример 2. В массиве каждый элемент равен 0, 1 или 2. Переставить элементы массива так, чтобы сначала располагались все 0, затем все 1 и, наконец, все 2. Дополнительный массив не использовать.

    Решение. Можно не переставлять элементы массива, а подсчитать количество 0, 1, 2 и заново заполнить массив требуемым образом.

    Пример 3. Даны два n-элементных массива Х и Y одного типа. Поменять местами все Xi и Yi, (i = 1…n), не используя промежуточные величины.

    Решение. Обмен можно выполнить в цикле для всех i от 1 до n с помощью серии из трех операторов присваивания:

    X[i] := X[i] + Y[i]

    Y[i] := X[i] – Y[i]

    X[i] := X[i] – Y[i].

    Пример 4. Записать алгоритм нахождения максимального элемента массива А(n) и его номера.

    Решение. На псевдокоде требуемый алгоритм запишется следующим образом:

    Примечание. Если таких элементов несколько, будет найден номер последнего.

    Пример 5. Найти сумму элементов одномерного массива А(n).

    Решение. На псевдокоде алгоритм нахождения суммы запишется следующим образом:

    Примечание. Для нахождения суммы положительных элементов массива вместо оператора

    S := S + A[i] необходимо записать:

    если A[i] > 0

    то S := S + A[i]

    всё

    Пример 6. Записать алгоритм вычисления произведения элементов столбцов заданной вещественной двумерной матрицы A(n, m).

    Решение. На псевдокоде алгоритм запишется следующим образом:

    Пример 7. Подсчитать количество элементов для заданной целочисленной матрицы A(n, m), равных ее максимальному элементу.

    Решение. На псевдокоде алгоритм запишется следующим образом:

    Пример 8. Запиcать алгоритм обмена элементами строк с номерами P и Q в заданной вещественной матрице A(n, m).

    Решение. На псевдокоде алгоритм запишется следующим образом:

    Пример 9. Включить заданное число D в одномерный упорядоченный по возрастанию массив F(n) с сохранением упорядоченности.

    Решение. На псевдокоде алгоритм запишется следующим образом:

    Пример 10. Сформировать новый массив B из элементов целочисленного массива A(n), для которых выполняется условие D < Ai < C.

    Решение. На псевдокоде алгоритм запишется следующим образом:

    Пример 11. Найти в заданном целочисленном массиве А(m) хотя бы одну пару элементов, совпадающих по значению.

    Решение. На псевдокоде алгоритм запишется следующим образом:

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

    1. элемент найден;
    2. весь массив просмотрен — элемент не найден.

    В упорядоченном массиве поиск можно значительно ускорить, применяя метод половинного деления, или бинарный поиск. Его идея заключается в следующем. Пусть фиксированный массив упорядочен по неубыванию (ai ≤ ai + 1). Случайно выбранный элемент am (обычно берут средний элемент) сравнивают с элементом поиска х. Если он меньше х, то искомый элемент может быть среди элементов am + i, …, аn, т. е. в правой половине массива. Если он больше х — то среди элементов левой части массива. Если же он равен х, то поиск успешно заканчивается.

    К стандартным задачам относятся задачи сортировки массива. Сортировка массива — это перерасположение элементов массива в заданном порядке. Основная цель сортировки — облегчить последующий поиск. Методы условно разделяют по главной идее алгоритма, а реализуются они целым семейством алгоритмов.

    К простым методам сортировки относят:

    • сортировку с помощью обмена (метод пузырька);
    • сортировку с помощью прямого включения;
    • сортировку с помощью выбора.

    Сортировка с помощью обмена. При использовании этого метода сортировки соседние элементы массива сравниваются и при необходимости меняются местами до тех пор, пока массив не будет полностью упорядочен. Повторные проходы массива каждый раз сдвигают наименьший (наибольший) элемент оставшейся части массива к левому его концу. Метод широко известен под названием «пузырьковая сортировка», т. к. большие (меньшие) элементы массива, подобно пузырькам, «всплывают» на соответствующую позицию. Основной фрагмент программы содержит два вложенных цикла, причем внутренний цикл удобнее выбрать с убывающим шагом.

    Алгоритм сортировки массива A(n) по возрастанию на псевдокоде:

    Сортировка с помощью прямого включения (вставки). На каждом шаге этого метода массив разделен на две части: левую, уже отсортированную, и правую, еще не отсортированную. Первый элемент правой части вставляется в левую часть массива так, чтобы левая часть осталась отсортированной. В результате отсортированная часть увеличивается на один элемент, а неотсортированная — на один элемент уменьшается. Таким образом, на каждом шаге алгоритма сортировки вставками приходится выполнять две операции: поиск позиции для вставки элемента и собственно его вставку с последующим сдвигом на одну позицию вправо от элементов отсортированной части. Этот сдвиг «стирает» первый элемент неотсортированной части. Сначала отсортированным подмассивом считаем первый элемент, а остальная часть массива относится к неотсортированной части. Поскольку операции сравнения и перемещения чередуются друг с другом, этот способ сортировки часто называют просеиванием или погружением.

    Сортировка с помощью прямого выбора. При сортировке этим методом сначала выбирается наименьший (наибольший) элемент массива и меняется местами с первым. Затем выбирается наименьший (наибольший) среди оставшихся (n – 1) элементов и меняется местами со вторым и т. д. до тех пор, пока не останется один наибольший (наименьший) элемент. Сортировка осуществляется с помощью двух вложенных циклов.

    Приведенные алгоритмы сортировки не требуют дополнительной оперативной памяти. Время выполнения алгоритмов сортировки пропорционально количеству операций сравнения и перестановки элементов. Сортировка массива из $n$ элементов методом выбора главного элемента требует выполнения ${n^2}/{2}$ операций сравнения и n операций обмена элементами. Метод сортировки вставками требует ${n^2}/{4}$ операций сравнения и столько же операций обмена, а метод пузырьковой сортировки — ${n^2}/{2}$ операций сравнения и столько же операций обмена. Таким образом, из трех рассмотренных методов сортировки массива методы вставки и выбора приблизительно эквивалентны, а обменная сортировка — медленнее. Кроме того, что в методе вставки исходные элементы могут поступать последовательно, а в методе выбора они должны быть в наличии до начала сортировки.

    Примеры решения задач

    Пример 1. Одномерный массив, содержащий десять элементов, заполняется по следующему закону: A[1] = 1; A[2] = X; A[i] = 2 * X * A[i – 1] – A[i – 2], где i = 3, 4, …, 10. Каким будет значение A[5] при X = 1?

    Решение. Представим значения первых пяти элементов массива А, полученные по заданному закону при Х = 1:

    A[1] = 1; A[2] = Х = 1;

    A[3] = 2 * Х * A[2] – A[1] = 2 * 1 * 1 – 1 = 1;

    A[4] = 2 * Х * A[3] – A[2] = 2 * 1 * 1 – 1 = 1;

    A[5] = 2 * Х * A[4] – A[3] = 2 * 1 * 1 – 1 = 1.

    Таким образом, значение A[5] при Х = 1 будет равно 1.

    Ответ: 1.

    Пример 2. Задан двумерный массив А(n, n). Определить, что вычисляет приведенный фрагмент алгоритма:

    Решение. В данном алгоритме переменной S присваивается значение 0. Затем в структуре циклов по переменным i и j каждый из элементов массива Аij сравнивается с нулем (А[i, j] > 0) и если элементы Аij положительны, то квадраты А[i, j]^2 положительных элементов Аij увеличивают значение суммы S (S := S + A[i, j]^2).

    Ответ: фрагмент алгоритма вычисляет сумму квадратов положительных элементов массива.

    Пример 3. Задан фрагмент алгоритма, использующий двумерный массив (таблицу) М(n, n), два одномерных массива A(n), B(n) и переменную X. Определить назначение массивов А и В и переменной.

    Решение. Представим фрагмент алгоритма словесно.

    1. Переменной X присвоить значение 0.
    2. Переменной i присвоить значение 1.
    3. Если i ≤ n, то перейти к следующему пункту; в противном случае — конец фрагмента алгоритма.
    4. Элементу одномерного массива А с индексом i присвоить значение элемента двумерного массива М, находящегося в i-й строке и первом столбце.
    5. Элементу одномерного массива В с индексом i присвоить значение 1.
    6. Переменной j присвоить значение 1.
    7. Если j ≤ n, то перейти к следующему пункту; в противном случае — к п. 13.
    8. Если М[i, j] < A[i], то перейти к следующему пункту; иначе — к п. 11.
    9. Элементу A[i] присвоить значение элемента массива М, находящегося в i-й строке и j-м столбце.
    10. Элементу В[i] присвоить значение переменной j.
    11. Переменной Х присвоить значение суммы X + M[i, j].
    12. Переменной j присвоить значение суммы j + 1 и вернуться к п. 7.
    13. Переменной i присвоить значение суммы i + 1 и вернуться к п. 3.

    Таким образом, анализ алгоритма показывает, что переменная X накапливала сумму всех элементов массива М; массив А — минимальные элементы соответствующих строк массива М; массив В — индексы (порядковые номера столбцов) минимальных элементов в соответствующих строках массива М.

    Пример 4. Составить алгоритм определения наличия среди элементов главной диагонали заданной целочисленной матрицы A(n, m) хотя бы одного положительного нечетного элемента.

    Решение. Для всех элементов Аij главной диагонали выполняется условие i = j. Определение наличия нечетных элементов выполняется с помощью операции mod (остаток от целочисленного деления), при этом, если результат mod равен 1, — число нечетное.

    Алгоритм:

    Структурирование задачи при ее решении для использования вспомогательного
    алгоритма. Вспомогательные алгоритмы: процедуры и функции

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

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

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

    Если вспомогательный алгоритм в процессе работы программы выполняется многократно, отличаясь только параметрами, то обычно прибегают к оформлению вспомогательного алгоритма в виде подпрограммы — алгоритма-процедуры, или алгоритма-функции.

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

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

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

    • количество формальных и фактических параметров должно совпадать, причем соответствие между параметрами команды вызова и формальными параметрами процедуры устанавливается по порядку следования: первый фактический параметр соответствует первой переменной, записанной в заголовке подпрограммы, второй фактический параметр — второй переменной и т. д.;
    • типы соответствующих параметров команды вызова и заголовка подпрограммы должны совпадать.

    Команда вызова подпрограммы выполняется в три этапа:

    1. вычисление фактических аргументов;
    2. исполнение алгоритма подпрограммы;
    3. присвоение полученных значений результатов алгоритма-подпрограммы соответствующим фактическим переменным.

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

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

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

    Подпрограммы, которые написаны пользователем, называются пользовательскими.

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

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

  • Рекурсия егэ информатика python
  • Рекурсия python задачи егэ
  • Рекурсия 16 задание егэ питон
  • Рекурсивные алгоритмы питон егэ
  • Рекурсивная функция егэ

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

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