Тип 16 № 46974 

Рекурсивные алгоритмы. Алгоритмы, опирающиеся на несколько предыдущих значений
i
Алгоритм вычисления значения функции F(n), где n — целое неотрицательное число, задан следующими соотношениями:
F(0) = 0;
F(n) = F(n − 1) + 1, если n нечётно;
F(n) = F(n / 2), если n > 0 и при этом n чётно.
Укажите количество таких значений n < 1 000 000 000, для которых F(n) = 2.
Спрятать решениеРешение. Заметим, что данная рекурсивная функция фактически подсчитывает количество единиц в числе n в двоичном виде. Тогда необходимо найти количество чисел в заданном диапазоне, которые в двоичном виде имеют только две цифры 1. То есть подходят числа вида 11, 101, 110, 1001, 1010, 1100 и так далее. Заметим также, что количество искомых чисел среди чисел, которые в двоичном виде состоит из двух знаков, равно 1, среди чисел, состоящих в двоичном виде из трёх знаков, равно 2, а среди чисел, состоящих в двоичном виде из четырёх знаков, равно 3 и так далее.
Число 1 000 000 000 в двоичном виде имеет 30 знаков. Максимальное подходящее число, для которого F(n) = 2 и состоящее в двоичном виде из 30 знаков, — 1100..002 = 805 306 36810, что меньше границы заданного диапазона. Значит, чтобы подсчитать количество подходящих чисел n, имеющих в двоичном виде от 1 до 30 знаков, и просуммировать количество найденных чисел для каждой разрядности, воспользуемся языком PascalABC:
var sum: integer;
i: integer;
begin
for i := 2 to 30 do
sum := sum + i - 1;
writeln(sum);
end.
Результат работы программы — 435.
Ответ: 435.
Приведём решение на языке Python.
Заметим, что данная рекурсивная функция фактически подсчитывает количество единиц в числе n в двоичном виде. Тогда необходимо найти количество чисел в заданном диапазоне, которые в двоичном виде имеют только две цифры 1. То есть подходят числа вида 11, 101, 110, 1001, 1010, 1100 и так далее. Заметим также, что количество искомых чисел среди чисел, которые в двоичном виде состоит из двух знаков, равно 1, среди чисел, состоящих в двоичном виде из трёх знаков, равно 2, а среди чисел, состоящих в двоичном виде из четырёх знаков, равно 3, и так далее.
Число 1 000 000 000 в двоичном виде имеет 30 знаков. Максимальное подходящее число, для которого F(n) = 2 и состоящее в двоичном виде из 30 знаков, — 1100..002 = 805 306 36810, что меньше границы заданного диапазона. Значит, чтобы подсчитать количество подходящих чисел n, имеющих в двоичном виде от 1 до 30 знаков, и просуммировать количество найденных чисел для каждой разрядности, воспользуемся языком Python:
k = 0
for i in range(2, 31):
k = k + i - 1
print(k)
Приведём другое решение.
Заметим, что данная рекурсивная функция фактически подсчитывает количество единиц в числе n в двоичном виде. Тогда необходимо найти количество чисел в заданном диапазоне, которые в двоичном виде имеют только две цифры 1. То есть подходят числа вида 11, 101, 110, 1001, 1010, 1100 и так далее. Число 1 000 000 000 в двоичном виде имеет 30 знаков. То есть необходимо разместить две единицы среди 30 позиций всеми возможными способами. Воспользуемся формулой вычисления сочетаний из 30 позиций по 2:

Приведем решение Бориса Савельева на языке Python.
cnt=0
for i in range (1,100):
for j in range (0,i):
if (2**i+2**j) < 1000000000:
cnt += 1
print(cnt)
Ответ: 435