2011-gre-cs-practice-book.pdf/Q46 — различия между версиями

Материал из DISCOPAL
Перейти к: навигация, поиск
(Объяснение)
(Вопрос: Q46-08c765)
Строка 27: Строка 27:
 
Какие из следующих утверждений могут служить инвариантом цикла для указанного выше цикла while?
 
Какие из следующих утверждений могут служить инвариантом цикла для указанного выше цикла while?
  
I. <code-c>i<10i<10</code-c> или <code-c>j<10j<10</code-c>
+
I. <m>i<10i<10</m> или <m>j<10j<10</m>
II. <code-c>i<11i<11</code-c> и <code-c>j<11j<11</code-c>
+
II. <m>i<11i<11</m> и <m>j<11j<11</m>
III. <code-c>k=i+jk=i+j</code-c>
+
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: или
    1. Условие цикла: .
    2. Если мы находимся внутри цикла, то одновременно и (то есть и то, и другое меньше 10).
      • Из того, что и , автоматически следует более слабое утверждение или .
    1. Значит, пока цикл ещё не прерван, утверждение « или » будет верно всегда (оно слабее, чем само условие цикла).
    2. I действительно является инвариантом.

---

  • II: и
    1. Во время работы цикла и могут принимать значения от до включительно.
      • Как только станет равным (или ), цикл прервётся.
    2. Внутри цикла мы имеем и .
      • Отсюда немедленно следует, что и .
    3. При приращении или на они не могут «перескочить» сразу через , так что в любой момент внутри цикла условие и сохраняется.
    1. II тоже является инвариантом (он даже слабее, чем , но тем не менее остаётся истинным всюду, пока цикл не завершён).

---

  • Утверждение III:
    1. Проверим на шагах цикла:
      • Начальные значения: , , .
        1. Очевидно, . Утверждение верно перед входом в цикл.
      • Шаг цикла:
        1. Если , то выполняется:

        1. Новая сумма увеличится на (так как увеличили на , не трогали). Параллельно тоже увеличился на . Значит, соотношение сохранится.
        1. Если , то выполняется:

        1. Аналогично, теперь снова увеличилось на (увеличился ), и тоже на . Значит, остаётся равным .
    1. После каждой итерации связь сохраняется.
    2. III однозначно является инвариантом.

Задача зарезервирована: Nikitashapovalov 20:53, 8 января 2025 (UTC)