Мирзоев Денис
?>

Записан рекурсивный алгоритм f/ procedure f(n: integer); begin writeln(n); if n > 0 then begin f(n - 1); f(n - 3) end; end чему равна сумма всех чисел напечатанных на экране при выполнении вызова f5

Информатика

Ответы

lolydragon
Представим, что мы знаем ответ на вопрос "чему равна сумма всех выписанных чисел при выполнении вызова 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).

Остается только расписать, чему равно S(5)...
S(-2) = -2
S(-1) = -1
S(0) = 0
S(1) = 1 + S(0) + S(-2) = 1 + 0 - 2 = -1
S(2) = 2 + S(1) + S(-1) = 2 - 1 - 1 = 0
S(3) = 3 + S(2) + S(0) = 3 + 0 + 0 = 3
S(4) = 4 + S(3) + S(1) = 4 + 3 - 1 = 6
S(5) = 5 + S(4) + S(2) = 5 + 6 + 0 = 11

ответ. 11.



При исследовании рекурсивных алгоритмов бывает полезно понять, сколько вызовов функций делает программа (например, если рисовать дерево вызовов, это будет показывать количество "стрелочек" на этом дереве). Представим себе, что мы стали выполнять алгоритм на бумаге, попробуем понять, сколько чисел придется выписывать.
Если #(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) также растет быстро, но это уже другая проблема.
katarinacorvus825

program sorting;

const

 N = 10;

var

 v: array[1..N] of integer;

 d: integer;

 i, t: integer;  

 k: boolean;  

begin

 randomize;

 write('ДО сортировки:    ');

 for i := 1 to N do

 begin

   readln(v[i])

   write(v[i]:6);

 end;

}  

 d := N div 2;

 while(d > 0) do

 begin

   k := true;  

   while k do

   begin

     k := false;

     i := 1;

     for i := 1 to N - d do

     begin

       if(v[i] > v[i + d]) then

       begin

         t := v[i];

         v[i] := v[i + d];

         v[i + d] := t;

         k := true;

       end;

     end;

   end;    

   d := d div 2;

 end;

 writeln;

 write('ПОСЛЕ сортировки: ');

 for i := 1 to N do

   write(v[i]:6);

 writeln;

end.

Wlad967857

Итак, вот ответы:

1) 3. небольших общественных веб-сайтов.

2) 4. текстовом процессоре Word.

3) 3. веб-дизайн.

4) 4. html.

5) 1. структуру и содержание.

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

4. названия пунктов меню делайте краткими; недопустимо     растягивание названия пункта на несколько строк.

7) 4. шаблон.

все ответы на 100% верны, можете не волноваться. сама только, что тест и решила поделиться с вами правильными ответами. была рада удачи на экзаменах.)

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

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

Записан рекурсивный алгоритм f/ procedure f(n: integer); begin writeln(n); if n > 0 then begin f(n - 1); f(n - 3) end; end чему равна сумма всех чисел напечатанных на экране при выполнении вызова f5
Ваше имя (никнейм)*
Email*
Комментарий*

Популярные вопросы в разделе

sashab82
aregaa
stmr29
multikbo3049
Bogdanov
tata-novik
vera-sherepa231
timonina29
vps1050
kriapex
xarchopuri22
MISAKOVNA49
infosmolenskay
mstapottery
Надья-Олеговна