×
  • 1. Системы счисления
  • 2. Логические функции
  • 3. Анализ информационных моделей
  • 4. Файловая система и базы данных
  • 5. Кодирование и декодирование. Условие Фано
  • 6. Выполнение и анализ простых алгоритмов
  • 7. Адресация в электронных таблицах
  • 8. Анализ программ с циклами
  • 9. Скорость передачи, объем памяти, время передачи
  • 10. Кодирование, комбинаторика
  • 11. Рекурсивные алгоритмы
  • 12. Адресация в сетях TCP/IP
  • 13. Вычисление количества информации
  • 14. Анализ и выполнение алгоритмов для исполнителя
  • 15. Поиск путей в графе
  • 16. Позиционные системы счисления
  • 17. Запросы в поисковых системах
  • 18. Логические выражения и множества
  • 19. Анализ программы по работе с массивом
  • 20. Анализ программ с циклами
  • 21. Анализ программ с циклами и подпрограммами
  • 22. Динамическое программирование
  • 23. Системы логических уравнений
  • 24. Исправление фрагмента программы и ошибок
  • 25. Программа на обработку массива
  • Спасибо за внимание
  • Подготовка к ЕГЭ по Информатике

    Задания на тему "Рекурсивные алгоритмы".


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

    def F(n):   
       print(n, end='') 
       if n >= 3:   
          F(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;
    void F(int n) {  
      std::cout << n; 
      if (n >= 3) {  
        F(n / 2);
        F(n - 1);  
      }
    }

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

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

    def F(n):
      if n > 0: 
          F(n - 1)
          print(n,end='')
          F(n - 2)
    procedure F(n: integer); 
    begin
       if n > 0 then begin
         F(n - 1);
         write(n);
         F(n - 2);
       end
    end;
    void F(int n){
      if (n > 0){ 
         F(n - 1);
         std::cout << n;
         F(n - 2);
      } 
    }

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

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

    def f(x):
        if x<16:
            f(x*2)
            print(2*x+1,end='')
            print(2*x-1,end='')
    procedure f(x: integer); 
    begin   
      if x < 16 then begin
          f(x*2);
          write(2*x+1);
          write(2*x-1);
      end;  
    end;
    void f(int x) {
      if (x < 16) {
        f (2*x);
        cout << 2*x+1;
        cout << 2*x-1;
      }
    }

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

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

    def f(x):
        if x<5:
            print(x,end='')
            f(x+1)
            print(x,end='')
    procedure f(x: integer); 
    begin   
      if x < 5 then begin
          write(x);   
          f(x + 1);
          write(x);
      end;  
    end;
    void f(int x) {
      if (x < 5) {
        cout <<x;
        f(x + 1);
        cout <<x;
      }
    }

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

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

    def F(n):    
       if n > 0:        
          print(n)      
          F(n - 3)        
          F(n // 3)
    procedure F(n: integer); 
    begin   
      if n > 0 then   begin
          write(n);   
          F(n - 3);
          F(n div 3)
      end;  
    end;
    void F(int n) {
      if (n > 0) {
        cout <<n;
        F(n - 3);
        F(n / 3);
      }
    }

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

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

    def F(n):
      if n > 0: G(n - 1)
    def G(n):
      print("*")
      if n > 1: F(n - 3)
    procedure F(n: integer);
    begin
      if n > 0 then G(n - 1);
    end;
    procedure G(n: integer);
    begin
      writeln('*');
      if n > 1 then F(n - 3);
    end;
    void F(int n) {
      if (n > 0) G(n - 1);
    }
    void G(int n) {
      printf("*");
      if (n > 1) F(n - 3);
    }

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

    def F(n):
      if n > 2: 
        return F(n-1) + G(n-2)
      else:
        return n
    def G(n):
      if n > 2: 
        return G(n-1) + F(n-2)
      else:
        return n+1
    function F(n: integer): integer;
    begin
      if n > 2 then F := F(n-1) + G(n-2)
      else F := n;
    end;
    function G(n: integer): integer;
    begin
      if n > 2 then G := G(n-1) + F(n-2)
      else G := n+1;
    end;
    int F(int n) {
      if (n > 2) 
        return F(n-1) + G(n-2);
      else 
        return n; 
    }
    void G(int n) {
      if (n > 2)
        return G(n-1) + F(n-2);
      else
        return n+1;
    }

    8) Ниже представлена реализация рекурсивной процедуры на трех языках программирования:

    def F(n):
      print(n)
      if n < 6:    
        F(n+2)
        F(n*3)
    procedure F(n: integer);
    begin
      writeln(n);
      if n < 6 then begin
        F(n+2);
        F(n*3)
      end
    end;
    void  F(int n) {
    	cout << n;
    	if (n < 6) {
    		F(n + 2);
    		F(n * 3);
    	}
    }

    Найдите сумму чисел, которые будут выведены при вызове F(1).

    9) Ниже представлена реализация рекурсивной процедуры на трех языках программирования:

    def F(n):
      if n < 3:
        print("*")
      else:
        F(n-1)
        F(n-2)
        F(n-2)
    procedure F(n: integer);
    begin
      if n < 3 then
        write('*')
      else begin
        F(n-1);
        F(n-2);
        F(n-2)
      end;
    end;
    void  F(int n) {
    	if (n < 3)
    		cout<< "*";
    	else {
    		F(n - 1);
    		F(n - 2);
    		F(n - 2);
    	}
    }

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

    10) Ниже представлена реализация рекурсивной процедуры на трех языках программирования:

    def F(n):
       if n==-3:
          return 1
       elif n==0:
           return F(n-1)
       else:
           return n*F(n-1)
    function F(n:integer):integer;
    begin
      if n=-3 then 
        F:=1
      else if n=0 then
        F:=F(n-1)
      else
        F:=n*F(n-1);
    end;
    int F(int n) {
    	if (n == -3)
    		return 1;
    	else if (n == 0)
    		return F(n - 1);
    	else
    		return n*F(n - 1);
    }

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

    11) Ниже представлена реализация рекурсивной процедуры на трех языках программирования:

    def F(n):
       if n==4:
          return 1
       elif n==0:
          return F(n+1)
       else:
          return n*F(n+1)
    function F(n:integer):integer;
    begin
      if n=4 then 
        F:=1
      else if n=0 then
        F:=F(n+1)
      else
        F:=n*F(n+1);
    end;
    int F(int n) {
    	if (n == 4)
    		return 1;
    	else if (n == 0)
    		return F(n + 1);
    	else
    		return n*F(n + 1);
    }

    Чему будет равна переменная n, если ей присвоить результат вызова F(-4) ?

    12) Ниже представлена реализация рекурсивной процедуры на трех языках программирования:

    def f(n):
      if n>0:
        if n % 2 != 0:
           print('!'*(n%10))
        else:
           print('?'*(n%10))
        f(n//10)
    procedure f(n:integer);
    begin
     if n>0 then begin
       if n mod 2 <>0 then
        writeln('!'*(n mod 10))
       else
         writeln('?'*(n mod 10));
       f(n div 10);
     end;
    end;
    void f(int n) {
    	if (n > 0) {
    		if (n % 2 != 0)
    			cout << '!'*(n % 10);
    		else
    			cout << '?'*(n % 10);
    		f(n / 10);
    	}
    }

    Сколько символов ? будет всего распечатано на экране при вызове f(865432) ?

    13) Ниже представлена реализация рекурсивной процедуры на трех языках программирования:

    def f(n):
      if n>0:
          print('?'*(n%7))
          f(n//10)
    procedure f(n:integer);
    begin
      if n>0 then begin
        writeln('?'*(n mod 7));
        f(n div 10);
      end;
    end;
    void f(int n) {
    	if (n > 0) {
    		cout << '?'*(n % 7) << endl;
    		f(n / 10);
    	}
    }

    Какое максимальное количество символов ? будет распечатано в одной строке при вызове f(2346) ?

    14) Ниже представлена реализация рекурсивной процедуры на трех языках программирования:

    def f(n):
      if n>0:
        if n % 2 != 0:
           print('!'*(n%10))
        else:
           print('?'*(n%10))
        f(n//10)
    procedure f(n:integer);
    begin
     if n>0 then begin
       if n mod 2 <>0 then
        writeln('!'*(n mod 10))
       else
         writeln('?'*(n mod 10));
       f(n div 10);
     end;
    end;
    void f(int n) {
    	if (n > 0) {
    		if (n % 2 == 0)
    			cout << '!'*(n % 10);
    		else
    			cout << '?'*(n % 10);
    		f(n / 10);
    	}
    }

    Сколько символов ? будет всего распечатано на экране при вызове f(73469) ?

    15) Ниже представлена реализация рекурсивной процедуры на трех языках программирования:

    def f(n,s):
      if n>0:
        print(s)
        f(n//10,s+'???')
    procedure f(n:integer;s:string);
    begin
      if n>0 then begin
        writeln(s);
        f(n div 10,s+'???');
      end;
    end;
    void f(int n, string s) {
    	if (n > 0) {
    		cout << s;
    		F(n / 2, s + '???');
    	}
    }

    Сколько символов ? будет всего распечатано на экране при вызове f(7135,'??') ?

    16) Ниже представлена реализация рекурсивной процедуры на трех языках программирования:

    def f(n,s):
      if n>0:
        print(s)
        f(n//2,s+'?')
    procedure F(n:integer;s:string);
    begin
      if n>0 then begin
        writeln(s);
        F(n div 2, s+'?');
      end;
    end;
    void F(int n, string s) {
    	if (n > 0) {
    		cout << s;
    		F(n / 2, s + '?');
    	}
    }

    Сколько символов ? будет всего распечатано на экране при вызове F(35,'?')?

    Задания взяты из базы данных ФИПИ, сайта К.Полякова или придуманы мною