Тема 16. Рекурсия
16.01 Одна функция
Вспоминай формулы по каждой теме
Решай новые задачи каждый день
Вдумчиво разбирай решения
ШКОЛКОВО.
Готовиться с нами - ЛЕГКО!
Подтемы раздела рекурсия
Решаем задачи

Ошибка.
Попробуйте повторить позже

Задача 1#63247

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

F (0) = 6  ;

F (n) = 1+ F (n∕2)  , если n > 0  и n  четное;

F (n) = F(n∕∕2)  , в остальных случаях.

В данной задаче ∕∕  означает деление нацело.

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

Показать ответ и решение

Решение №1

def build_bin(string, lenght):
    # Если длина построенного слова совпадает с максимальной длинной
    if len(string) == lenght:
        return string.count(’0’) == 3 and int(string, 2) <= 10**9
    counter = 0
    # Строим новые двоичные числа (прибавляем 0 или 1)
    if string.count(’0’) < 3:
        counter += build_bin(string + ’0’, lenght) + \
                   build_bin(string + ’1’, lenght)
    # Если дошли до количества равного 3, то прибавляем данное
    # число (дописываем единицы)
    if string.count(’0’) == 3:
        counter += int(string + ’1’ * (lenght - len(string)), 2) <= 10**9
    return counter

ans = 0
for i in range(4, 31):
    ans += build_bin(’1’, i)
print(ans)

Решение №2

ans = 0
# Будем строить вида "из всех единичек"
# Напимер: 1111111 и нужно перебрать три единички
# То есть вычесть 3 единички из двоичного числа
# Поэтому вычитаем степени двойки
for i in range(31):
    for j in range(i + 1, 31):
        for k in range(j + 1, 31):
            for a in range(k + 1, 31):
                N = 2 ** (a + 1)
                N -= 1
                N = N - 2 ** k - 2 ** j - 2 ** i
                if 1 <= N <= 10 ** 9:
                    ans += 1
print(ans)

Ответ: 24552

Ошибка.
Попробуйте повторить позже

Задача 2#58256

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

F(n ) = n  , если log2(n)  целое число

F(n ) = f (n − 1) + 2,  иначе

Чему равно f (786432)  ?

Показать ответ и решение

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

def stepen(n):
    while n > 1:
        if n % 2 != 0:
            return False
        n //= 2
    return True

def f(n):
    if stepen(n):
        return n
    else:
        return f(n - 1) + 2

Заметим, что функция от степеней двойки выводит само число, а для остальных получается значение *степень двойки* + 2. И так до следующей степени двойки.

Число 2 ∗ ∗19 < 786432 < 2 ∗ ∗20,  более того, 786432 = 2 ∗ ∗20 − 2 ∗ ∗19 ∕∕2.  Значит, что f (786432 ) = 2 ∗ ∗19 + (786432 − 2 ∗ ∗19 ) ∗ 2 = 1048576.

Ответ: 1048576

Ошибка.
Попробуйте повторить позже

Задача 3#56481

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

F (n) = True  , при n = 1

F (n) = False  , если n  нечетно

F (n) = F(n∕∕2),  иначе

Определите для скольких чисел из отрезка [2;100000000]  функция вернет значение True?

Показать ответ и решение

Если число не будет полной степенью двойки, то при последовательном делении на 2  мы вскоре получим нечетное число (кроме 1  ) и вернем F alse  , True  вернут только степени двойки в данном диапазоне. Эффективно переберем все числа-степени двойки в данном отрезке

k = 0
x = 2
while x <= 100000000:
    k += 1
    x *= 2
print(k)

Ответ: 26

Ошибка.
Попробуйте повторить позже

Задача 4#56475

Алгоритм вычисления значения функции F(x, y, z), где x, y, z - натуральные числа, задан следующим образом:

F (x,y,z) = 0,  если x = 11,y = 13,z = 17  ,

            18
F (x,y,z) = 10 ,  если x < 0  , либо y < 0  , либо z < 0,

F (x,y,z) = min (F(x− 1,y,z),F (x,y− 1,z),F (x,y,z − 1))+ 1,  иначе

Вычислите F (105,106,107).

Показать ответ и решение

Заметим, что функция ищет манхэттенское расстояние в 3хмерном простанстве между точками (x,y,z)  и (11,13,17)  . Причем работает корректно только если x >= 11,y >= 13,z >= 17  .

Примечание: Манхеттенское расстояние, или расстояние городских кварталов - расстояние между двумя точками в n-мерном пространстве равное сумме модулей разностей их координат. Для 2хмерного пространства можно представить себе уличную планировку города Манхеттен, а именно квадратную сетку, где мы можем ходить только по этой сетке и расстояние между двумя ближайшими пересечениями равно единице.

PIC

Можем заметить, что сумма координат минус значение функции от этих координат всегда равно сумме координат точки, до которой мы ищём расстояние(11+ 13+ 17 = 41)

Иными словами здесь инвариантом является x + y+ z − f(x,y,z) = 41  .

Отсюда можем выразить f(x,y,z) = x+ y +z − 41

Ответ: f (x,y,z) = 105 +106 + 107 − 41 = 11099959

Ответ: 11099959

Ошибка.
Попробуйте повторить позже

Задача 5#56376

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

Показать ответ и решение

Поскольку числа слишком большие, то будем решать аналитикой. Для начала вычислим значения F(4999),F (4998),F(4997) :

            F (5000)
F (4999) = 2 ∗-5000- = 2∗ 4999!

F (4998) = 2 ∗ F-(4999) = 22 ∗ 4998!
              4999

            F (4998)
F (4997) = 2 ∗------ = 23 ∗ 4997!
              4998

Замечаем, что в общем виде F  вычисляется как         5000−n
F (n) = 2     ∗n!

Вычислим требуемое и получим ответ.

Ответ: 26250

Ошибка.
Попробуйте повторить позже

Задача 6#56375

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

f(n) = 1  , при n = 0  или n = 1

f(n) = f (n − 1)∗n,  иначе

Найдите чему равно значение f(2)   f(3)       f(10000)
----+  ----+ ...+ --------
f(1)   f(2)       f(9999)

Показать ответ и решение

Что такое   f(i)
f(i−-1)?  Это есть просто число i  . А значит, нужно найти сумму чисел от 2 до 10000 включительно.

Ответ: 50004999

Ошибка.
Попробуйте повторить позже

Задача 7#56374

Известно, что значение Akn  , где k,n  — целые неотрицательные числа можно выразить через Ckn  следующим образом:

Ak = Ck ∗k!
  n   n

Найдите чему равно значение  15
A20  .

Показать ответ и решение
def f(n):
    if n == 0 or n == 1:
        return 1
    return f(n-1)*n

def C(n, k):
    if (k == 0 or k == n):
        return 1
    else:
        return C(n - 1, k - 1) + C(n - 1, k)


n, k = map(int, input().split())
print(C(n, k) * f(k))

Ответ: 20274183401472000

Ошибка.
Попробуйте повторить позже

Задача 8#56373

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

Ckn = 1  , при k = 0  или k = n

Ck = Ck− 1+ Ck
 n    n− 1   n−1

Найдите чему равно значение  10
C20  .

Показать ответ и решение
def C(n, k):
    if (k == 0 or k == n):
        return 1
    else:
        return C(n - 1, k - 1) + C(n - 1, k)


n, k = map(int, input().split())
print(C(n, k))

Ответ: 184756

Ошибка.
Попробуйте повторить позже

Задача 9#56372

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

f(n) = 1  , при n = 0  или n = 1

f(n) = f (n − 1)∗n,  иначе

Найдите чему равно значение f(2023)∕∕f(2022)?

Показать ответ и решение

Функция вычисляет факториал, т.е. произведение всех чисел от 1 до n.

То есть 1∗2-∗⋅⋅⋅∗2022∗-2023.
  1 ∗2∗ ⋅⋅⋅∗ 2022

Значит, после деления у нас останется только число 2023.

Ответ: 2023

Ошибка.
Попробуйте повторить позже

Задача 10#56317

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

F (1) = 1

F (k) = F(k− 1)  , если k - четное

F (k) = F(k− 1)+ k  , если k - нечетное

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

Показать ответ и решение
def f(n):
    if n == 1:
        return 1
    if n % 2 == 0:
        return f(n - 1)
    return f(n - 1) + n
print(f(10))

 

Ответ: 25

Ошибка.
Попробуйте повторить позже

Задача 11#56154

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

F (0,0) = 0;

F (a,b) = F (a− 1,b) + b  , если a > b  ;

F (a,b) = F (a,b − 1) + a  , если a ≤ b  и b > 0  .

Укажите количество таких целых неотрицательных чисел a  , для которых можно подобрать такое b  , что F (a,b) = 5555555555555  .

Показать ответ и решение

Если начать подставлять случайные a  и b  в функцию, то станет очевидно, что F (a,b) = a ⋅b.  Значит нам нужно найти количество способов разложить число n  на произведение двух множителей. Тогда ответом будет количество делителей у числа n  так как для любого делителя a  найдется целое неотрицательное b = n
    a  . Найдем все делители n  с помошью кода.

def get_divs(number):
    divs = []
    for i in range(1, int(number**0.5) + 1):
        if number % i == 0:
            divs.append(i)
            if i != int(number**0.5):
                divs.append(number//i)
    return divs

print(len(get_divs(5555555555555)))

Ответ: 16

Ошибка.
Попробуйте повторить позже

Задача 12#56152

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

F (0) = 0;

F (n) = F(n − 1) +2 ⋅n− 1.

Найдите значение F(55555555555).

Показать ответ и решение

Протестируем функцию на маленьких n  . Получим F(1) = 1  F(2) = 4  F (3) = 9  F (4) = 16  F(5) = 25  F(6) = 36.  Оказалось, что функция F (n)  рекурсивно находит n2.  F (55555555555) = 555555555552 = 3086419753024691358025.

Ответ: 3086419753024691358025

Ошибка.
Попробуйте повторить позже

Задача 13#56149

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

F (0) = 0;

F (n) = F(n − 1) +n.

Укажите количество таких чисел n  из интервала 555555555 ≤ n < 1555555555  , для которых F(n)  не делится без остатка на 3  .

Показать ответ и решение

Заметим, что функция F(n)  находит сумму чисел от 1  до n.  Тогда мы можем найти значение функции F(n)  как n⋅(n+21).  Также заметим, что значение функции F(n)  дает остаток 1  по модулю 3  только тогда, когда n  дает остаток 1  по модулю 3  и дает остаток 0  в остальных случаях. Для поиска ответа нам нужно посчитать количество чисел с остатком 1  на заданном промежутке. Тогда всего нам подходит 1555555554−555555555
--------3-------= 333333333  числа.

Ответ: 333333333

Ошибка.
Попробуйте повторить позже

Задача 14#56148

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

F (0) = 0;

F (n) = F(n  div  10) + (n  mod  10).

Укажите количество таких чисел n из интервала 555555555 ≤ n < 1555555555  , для которых F (n) > F (n + 1)

Показать ответ и решение

Заметим, что функция F(n)  на самом деле считает сумму цифр числа n.  Значит нужно понять для каких n  сумма цифр числа n  больше суммы цифр числа n + 1.  Такое возможно только в случае перехода между разрядами, то есть нам подходят все n  принадлежащие промежутку и заканчивающиеся на 9.  Тогда нам подходит каждое десятое число, всего в промежутке 1555555555− 555555555 = 1000000000  чисел. Итого нам подходит 1000000000
---10----= 100000000  чисел.

Ответ: 100000000

Ошибка.
Попробуйте повторить позже

Задача 15#55600

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

F (1) = 1  , F(2) = 1  , F (3) = 1

F (n) = F(n − 1) +F (n− 3)+ F (n ∕3)  , если n > 3  и четно

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

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

Показать ответ и решение

Напишем программу:

        def F(n):
            if n == 1 or n == 2 or n == 3:
                return 1
            if n > 3 and n % 2 == 0:
                return F(n - 1) + F(n - 3) + F(n // 3)
            if n > 3 and n % 2 != 0:
                return F(n - 2) + F(n - 1)

        print(F(30))

Ответ: 248055

Ошибка.
Попробуйте повторить позже

Задача 16#55599

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

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

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

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

Показать ответ и решение

Напишем программу:

        def F(n):
            if n == 1:
                return 0
            if n == 2 or n == 3:
                return 1
            if n > 3:
                return F(n - 1) + n ** 2 + F(n - 2)

        print(F(19))

Ответ: 94599

Ошибка.
Попробуйте повторить позже

Задача 17#43476

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

F (x) = F(x+ 1)  при таких x, которые не делятся нацело на 1012

F (x) = x∕1012  при таких x, которые делятся нацело на 1012

Вычислите        12
F (2⋅10  + 1000− 7)

Показать ответ и решение

Заметим, что терминальными аргументами, то есть такими, что функции сразу же вернет ответ, являются числа делящиеся на 1012  . Поэтому достаточно лишь найти ближайшее больше либо равное первоначального аргумента такое значение. Для числа 2∗ 1012 +1000 − 7  таковым является 3∗ 1012  , а ответ 3.

Более того можно заметить, что             12        12
f(x) = (x + 10 − 1)∕∕10

Ответ: 3

Ошибка.
Попробуйте повторить позже

Задача 18#37820

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

F (1) = 1,

F (n) = F(n − 1) +2 ⋅n− 1.

В ответе запишите значение от     9
F (10 + 777)  .

Показать ответ и решение

Ключевое замечание в этой задаче следующее: f(x) = x ⋅x  . Заметить это можно по-разному.

Первый способ: заметим что 2⋅x − 1  это значение дискретной производной многочлена x⋅x  , а значит так как f(1) = 1 = 1⋅1  , функция f(x)  действительно для всех целых чисел в качестве результата возвращает x ⋅x  .

Второй способ: давайте выведем первые 10  значений функции и заметим закономерность. После этого докажем по индукции своё предположение.

Ответ: 1000001554000603729

Ошибка.
Попробуйте повторить позже

Задача 19#36056

Существует алгоритм, позволяющий возводить число a  в степень x  не за N  операций, а за log2(N )  . Он называется бинарным алгоритмом возведения в степень.

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

F (a,1) = a

F (a,x) = a⋅F(a,x − 1)  , если x  нечетное

F (a,x) = F(a,x∕∕2)⋅F(a,x∕∕2)  , если x  четное

Чему равно значение выражения (F(2,2)+ F(3,3)+ ...+ F(10000,10000))%10000  ?

Показать ответ и решение
    def f(a, x):
        if x == 1:
            return a
        if x % 2 != 0:
            return a * f(a, x - 1)
        b = f(a, x // 2)
        return b * b


    ans = 0
    for i in range(2, 10000 + 1):
        ans += f(i, i)
    print(ans % 10000)

Ответ: 4499

Ошибка.
Попробуйте повторить позже

Задача 20#36054

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

F (1) = 1

F (2) = 2

F (k) = F(k− 1)⋅F (k− 2)⋅k

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

Показать ответ и решение
  def f(n):
      if n == 1:
          return 1
      if n == 2:
          return 2
      return f(n - 1) * f(n - 2) * n

  print(f(5))

Ответ: 1440
Рулетка
Вы можете получить скидку в рулетке!