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