2011-gre-cs-practice-book.pdf/Q46 — различия между версиями
Материал из DISCOPAL
(→Объяснение) |
(→Вопрос: Q46-08c765) |
||
Строка 27: | Строка 27: | ||
Какие из следующих утверждений могут служить инвариантом цикла для указанного выше цикла while? | Какие из следующих утверждений могут служить инвариантом цикла для указанного выше цикла while? | ||
− | I. < | + | I. <m>i<10i<10</m> или <m>j<10j<10</m> |
− | II. < | + | II. <m>i<11i<11</m> и <m>j<11j<11</m> |
− | III. < | + | III. <m>k=i+jk=i+j</m> |
=== Ответы === | === Ответы === |
Версия 23:25, 8 января 2025
Вопрос: Q46-08c765
i = 0; j = 0; k = 0; while (i < 10 and j < 10) { if (A[i] > B[j]) { C[k] = A[i]; k = k + 1; i = i + 1; } else { C[k] = B[j]; k = k + 1; j = j + 1; } }
Какие из следующих утверждений могут служить инвариантом цикла для указанного выше цикла while?
I. или II. и III.
Ответы
- (A) Только I
- (B) I и II
- (C) I и III
- (D) II и III
- Правильный ответ: (E) I, II и III
Объяснение
Исходники — вопрос 46 на 46 странице книги «2011-gre-cs-practice-book.pdf»
Разберём каждое из утверждений
инвариант цикла – это некоторое утверждение о переменных, которое остаётся истинным:
- перед входом в цикл,
- после каждой итерации цикла (если цикл продолжается),
- при завершении цикла.
- I: или
- Условие цикла: .
- Если мы находимся внутри цикла, то одновременно и (то есть и то, и другое меньше 10).
- Из того, что и , автоматически следует более слабое утверждение или .
- Значит, пока цикл ещё не прерван, утверждение « или » будет верно всегда (оно слабее, чем само условие цикла).
- I действительно является инвариантом.
---
- II: и
- Во время работы цикла и могут принимать значения от до включительно.
- Как только станет равным (или ), цикл прервётся.
- Внутри цикла мы имеем и .
- Отсюда немедленно следует, что и .
- При приращении или на они не могут «перескочить» сразу через , так что в любой момент внутри цикла условие и сохраняется.
- Во время работы цикла и могут принимать значения от до включительно.
- II тоже является инвариантом (он даже слабее, чем , но тем не менее остаётся истинным всюду, пока цикл не завершён).
---
- Утверждение III:
- Проверим на шагах цикла:
- Начальные значения: , , .
- Очевидно, . Утверждение верно перед входом в цикл.
- Начальные значения: , , .
- Проверим на шагах цикла:
- Шаг цикла:
- Если , то выполняется:
- Шаг цикла:
- Новая сумма увеличится на (так как увеличили на , не трогали). Параллельно тоже увеличился на . Значит, соотношение сохранится.
- Если , то выполняется:
- Аналогично, теперь снова увеличилось на (увеличился ), и тоже на . Значит, остаётся равным .
- После каждой итерации связь сохраняется.
- III однозначно является инвариантом.
Задача зарезервирована: Nikitashapovalov 20:53, 8 января 2025 (UTC)