Перейти к содержимому

Определите что выведет на экран программа при вызове f 9

  • автор:

Определите что выведет на экран программа при вызове f 9

11 задание 115 номер не сходится с ответом

АннаФр: 115) Определите, что выведет на экран программа при вызове F(9). procedure F(n: integer); begin if n > 0 then begin F(n – 4); F(n div 2); write(n) end end; У меня получилось 012401201, в ответе 11251249

Поляков: АннаФр пишет: У меня получилось 012401201, в ответе 11251249 Проверьте по программе.

polyakovss: Здравствуйте! F(9)=F(5)F(4)9 F(5)=F(1)F(2)5 F(4)=F(0)F(2)4 F(2)=F(-2)F(1)2 F(1)=F(-3)F(0)1 Учтем, что процедура F(n) "работает" при n > 0. Значит, F(0), F(-3), F(-2) ничего не делают. Их можно вычеркнуть. Теперь идем в обратном порядке: F(1)=F(-3)F(0)1=1 F(2)=F(-2)F(1)2 = F(1)2=1 2=12 F(4)=F(0)F(2)4=F(2)4=12 4=124 F(5)=F(1)F(2)5=1 12 5=1125 F(9)=F(5)F(4)9=1125 124 9=11251249 F(9)=11251249

Определите, что выведет на экран программа при вызове F(9).
procedure F(n: integer);
begin
write(n);
if n > 3 then begin
F(n – 4);
F(n div 2);
end;
end;
Сложность этой задачи в том, что вывод стоит до условий, а не в нем. Как тогда рассуждать?

Ну ты просто выдумал себе сложности, при вызове F она выведет 9, паскаль не знаю, но точно утверждаю, что это так.

Сначала идёт вывод переменной а потом операции с ней, ничего додумывать не нужно.

Определите, что выведет на экран программа при вызове f(9). procedure f(n: integer); begin if n > 0 then begin write(n); f(n — 4); f(n div 2) end end; нужно полное решение.

Const
N = 10;
Var
A:array[1..N] of integer;
i,j,M,B,C,p,s:integer;
Begin
Randomize;
<Заполнение и вывод>
Write(‘Исходный массив:’);
For i:= 1 to N do
Begin
A[i]:=random(N);
Write(‘ ‘,A[i]);
End;
WriteLn;
<Сортировка>
p:=0;
For i:= 1 to N do
Begin
M:=i;
For j:= i+1 to N do
if A[j]<A[M] then M:=j;
if M<>i then
Begin
B:=A[M];
A[M]:=A[i];
A[i]:=B;
p:=p+1;
<Вывод каждого шага сортировки>
Write(‘Перестановка №’,p,’:’);
For j:= 1 to N do
Write(‘ ‘,A[j]);
WriteLn;
End;
End;
WriteLn;
Write(‘Отсортированный массив:’);
For i:= 1 to N do
Write(‘ ‘,A[i]);
<Бинарный поиск>
WriteLn;
Write(‘Введите число: ‘);ReadLn(C);
m:=N div 2;
i:=1;
j:=N;
s:=0;
While (A[m]<>C)and(i<=j) do
Begin
if C > A[m] then i:=m+1
else j:=m-1;
s:=s+1;
m:=(i+j) div 2;
End;
WriteLn;
if A[m]=C then WriteLn(‘В массиве есть данное число’)
else WriteLn(‘В массиве нет данного числа’);
WriteLn(‘Кол-во перестановок за сортировку: ‘,p);
WriteLn(‘Кол-во сравнений за поиск: ‘,s);
End.

Примеры:
Исходный массив: 0 4 5 4 1 2 6 7 0 7
Перестановка №1: 0 0 5 4 1 2 6 7 4 7
Перестановка №2: 0 0 1 4 5 2 6 7 4 7
Перестановка №3: 0 0 1 2 5 4 6 7 4 7
Перестановка №4: 0 0 1 2 4 5 6 7 4 7
Перестановка №5: 0 0 1 2 4 4 6 7 5 7
Перестановка №6: 0 0 1 2 4 4 5 7 6 7
Перестановка №7: 0 0 1 2 4 4 5 6 7 7

Отсортированный массив: 0 0 1 2 4 4 5 6 7 7
Введите число: 3

В массиве нет данного числа
Кол-во перестановок за сортировку: 7
Кол-во сравнений за поиск: 4

Исходный массив: 4 4 1 3 4 4 5 0 7 2
Перестановка №1: 0 4 1 3 4 4 5 4 7 2
Перестановка №2: 0 1 4 3 4 4 5 4 7 2
Перестановка №3: 0 1 2 3 4 4 5 4 7 4
Перестановка №4: 0 1 2 3 4 4 4 5 7 4
Перестановка №5: 0 1 2 3 4 4 4 4 7 5
Перестановка №6: 0 1 2 3 4 4 4 4 5 7

Отсортированный массив: 0 1 2 3 4 4 4 4 5 7
Введите число: 5

В массиве есть данное число
Кол-во перестановок за сортировку: 6
Кол-во сравнений за поиск: 2

Определите, что выведет на экран программа при вызове F(9). procedure F(n: integer); begin write(n

Ну ты просто выдумал себе сложности, при вызове F она выведет 9, паскаль не знаю, но точно утверждаю, что это так.

Сначала идёт вывод переменной а потом операции с ней, ничего додумывать не нужно.

Для определения того, что программа выведет на экран при вызове F(9) , давайте разберемся в её работе.

Когда функция F(n) вызывается с аргументом n = 9 , она делает следующее:

Записывает значение n на экран (в данном случае, выводится число 9).

Проверяет условие n > 3 . В данном случае оно выполняется, так как 9 больше 3.

Выполняется блок begin. end , в котором происходят два рекурсивных вызова функции F() :

  • Первый вызов: F(9 — 4) , то есть F(5) .
  • Второй вызов: F(9 div 2) , то есть F(4) .

Давайте продолжим разбираться с этими вызовами:

  • Выводится значение 5 .
  • Проверяется условие n > 3 , которое выполняется, так как 5 больше 3.
  • Выполняется блок begin. end , в котором происходят еще два рекурсивных вызова:
    • F(5 — 4) , то есть F(1) .
    • F(5 div 2) , то есть F(2) .
    • Выводится значение 1 .
    • Проверяется условие n > 3 , которое не выполняется, так как 1 не больше 3. Рекурсивные вызовы в этом случае не происходят.
    • Выводится значение 2 .
    • Проверяется условие n > 3 , которое не выполняется, так как 2 не больше 3. Рекурсивные вызовы в этом случае также не происходят.

    Таким образом, после выполнения всех вызовов функции F() , результатом вызова F(9) будет последовательность чисел, выводимых на экран: 9 5 1 2 .

    Важно понимать, что порядок вывода чисел обусловлен порядком выполнения рекурсивных вызовов и их завершением. Так как вызовы делаются до условий, это может привести к изменению обычного порядка вывода результатов, как в данном случае.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *