Дано результати шкільного турніру з бігу на дистанції 100 м в якому брали участь 12 учасників визначте найбільший і найменший час бігу учасників змагань
1) Целая часть от деления: Остаток от деления: 96 div 2 = 48 96 mod 2 = 0 48 div 2 = 24 48 mod 2 = 0 24 div 2 = 12 24 mod 2 = 0 12 div 2 = 6 12 mod 2 = 0 6 div 2 = 3 6 mod 2 = 0 3 div 2 = 1 3 mod 2 = 1 1 div 2 = 0 1 mod 2 = 1 Остаток от деления записываем в обратном порядке. Получаем число в 2-ой системе счисления: 1100000 96 = 1100000² 2) Для перевода дробной части - числа последовательно умножаем дробную часть на основание 2. В результате каждый раз записываем целую часть произведения. 0.112*2 = 0.224 (целая часть 0) 0.224*2 = 0.448 (целая часть 0) 0.448*2 = 0.896 (целая часть 0) 0.896*2 = 1.792 (целая часть 1) Получаем число в 2-ой системе счисления: 0001 0.114 = 0001² 3) Остаток от деления записываем в обратном порядке. Получаем число в 2-ой системе счисления: 100010 34 = 100010² Для перевода дробной части числа последовательно умножаем дробную часть на основание 2. В результате каждый раз записываем целую часть произведения. 0.675*2 = 1.35 (целая часть 1) 0.35*2 = 0.7 (целая часть 0) 0.7*2 = 1.4 (целая часть 1) 0.4*2 = 0.8 (целая часть 0) Получаем число в 2-ой системе счисления: 1010 0.675 = 1010² В итоге получаем число: 100010.1010² 4) Остаток от деления записываем в обратном порядке. Получаем число в 2-ой системе счисления: 11000 24 = 11000² 5) Для перевода дробной части числа последовательно умножаем дробную часть на основание 2. В результате каждый раз записываем целую часть произведения. 0.65*2 = 1.3 (целая часть 1) 0.3*2 = 0.6 (целая часть 0) 0.6*2 = 1.2 (целая часть 1) 0.2*2 = 0.4 (целая часть 0) Получаем число в 2-ой системе счисления: 1010 0.65 = 1010² 6) Для перевода дробной части числа последовательно умножаем дробную часть на основание 2. В результате каждый раз записываем целую часть произведения. 0.25*2 = 0.5 (целая часть 0) 0.5*2 = 1 (целая часть 1) 0*2 = 0 (целая часть 0) 0*2 = 0 (целая часть 0) Получаем число в 2-ой системе счисления: 0100 0.25 = 0100²
Представим, что мы знаем ответ на вопрос "чему равна сумма всех выписанных чисел при выполнении вызова F(n)" для всех n < k. Попробуем понять, как найти ответ для n = k.
Что делает F(n)? Читаем текст программы: сначала выводит n, а потом (если n > 0) запускает F(n - 1) и F(n - 3). Обозначим S(n) - сумму всех чисел после вызова F(n), тогда (при n > 0) S(n) = n + S(n - 1) + S(n - 3)
Для неположительных n получаем, что S(n) = n (т.к. F(n) просто выводит n и завершает работу, не запуская никаких других F).
При исследовании рекурсивных алгоритмов бывает полезно понять, сколько вызовов функций делает программа (например, если рисовать дерево вызовов, это будет показывать количество "стрелочек" на этом дереве). Представим себе, что мы стали выполнять алгоритм на бумаге, попробуем понять, сколько чисел придется выписывать. Если #(N) - число вызовов процедуры F при наивном вычислении F(N). Понятно, что #(N) = #(N - 1) + #(N - 3) (при N <= 0 #(N) = 1). Не задаваясь целью получить точную формулу для #(N), получим только оценку (на самом деле, весьма показательную). Очевидно, что #(N - 1) >= #(N - 3), тогда #(N) >= 2 * #(N - 3). Так как #(0) = 1, то #(3) >= 2 * #(0) = 2, #(6) >= 2 * #(3) >= 2^2, #(9) >= 2 * #(6) >= 2^3, и вообще #(3N) >= 2^N Отсюда можно предположить, что #(N) растет не медленнее, чем 2^(N/3) >= 1.25^N. Если 1,25^N кажется медленно растущей функцией - это вовсе не так, для N = 100 (это немного, наверно?) получим число, большее миллиарда. Так что если не запоминать промежуточные результаты, результат будет считаться ооочень долго. S(N) также растет быстро, но это уже другая проблема.
0,0(0 оценок)
Полный доступ
Позволит учиться лучше и быстрее. Неограниченный доступ к базе и ответам от экспертов и ai-bota
Оформи подписку