Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Data Structures and Algorithms in C++ 2e (На ру...docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
2.37 Mб
Скачать

4.3. Простые методы оправдания 183

Суждение 4.20: Рассмотрите функцию Фибоначчи F (n), где мы определяем F (1) = 1, F (2) = 2 и F (n) = F (n- 1) + F (n- 2) для n> 2. (См. Раздел 2.2.3.) Мы

утверждайте что F (n) <2n.

Оправдание: Мы показываем, что наше требование правильное индукцией.

Основные случаи: (n2£). F (1) = 1 <2 = 21 и F (2) = 2 <4 = 22.

Шаг индукции: (n> 2). Предположим, что наше требование верно для n <n. Рассмотрите F (n). С тех пор

n> 2, F (n) = F (n- 1) + F (n- 2). Кроме того, с тех пор n- 1 <n и n- 2 <n, мы

может применить индуктивное предположение (иногда называемый «индуктивной гипотезой»)

подразумевать что F (n) <2n-1 + 2n-2, с тех пор

2n-1 + 2n-2 <2n-1 + 2n-1 = 2 2n-1 = 2n.

Давайте сделаем другой индуктивный аргумент, на сей раз для факта, который мы видели прежде. Суждение 4.21: (который совпадает с Суждением 4.3),

n

å1i = n (n + 1). я = 2

Оправдание: Мы оправдываем это равенство индукцией. Основной случай: n = 1. Тривиальный, для 1 = n (n + 1)/2, если n = 1.

Шаг индукции: n³ 2. Предположите, что требование верно для n <n. Рассмотрите n.

n n-1

i = å1i = n +å1 i. я =

Гипотезой индукции, тогда

å1i = n + (n-21) n, n

i =

который мы можем упростить как

n + (n- 1) n = 2n + n- n = n + n = n (n + 1). 2 2

2 2 2 2

Мы можем иногда чувствовать себя разбитым задачей оправдания чего-то истинного

для всего n³ 1. Мы должны помнить, однако, конкретность индуктивной технологии -

nique. Это показывает, что для любого особого n есть конечная постепенная последовательность

значения, который начинается с чего-то истинного и приводит к правде о n. Короче говоря, индуктивный аргумент - формула для строительства последовательности прямых оправданий.

184 Глава 4. Аналитические инструменты

Инварианты петли

Заключительный метод оправдания, который мы обсуждаем в этой секции, является инвариантом петли. Доказать некоторое заявление о петле правильно, определите с точки зрения серии

меньшие заявленияΣ0,Σ1...,Σk, где:

1. Первоначальное требование,Σ0, верно, прежде чем петля начнется.

2. ЕслиΣi-1 верен перед повторением i, тоΣi верен после повторения i. 3. Заключительное заявление,Σk, подразумевает заявление, что мы хотим быть верными.

Давайте дадим простой пример использования инвариантного петлей аргумента, чтобы оправдать правильность алгоритма. В частности давайте рассмотрим использование инварианта петли, чтобы оправдать правильность arrayFind, показанного в Кодовом Фрагменте 4.5, для нахождения элемента x во множестве A.

Алгоритм arrayFind (x, A):

Вход: элемент x и множество n-элемента, A.

Продукция: индекс i, таким образом, что x = [я] или-1, если никакой элемент A не равен x.

i¬0

в то время как я <n делаю

если x = [я] тогда

возвратитесь i

еще

я¬ i+1

возвратитесь-1

Кодовый Фрагмент 4.5: Алгоритм arrayFind для нахождения данного элемента во множестве.

Чтобы показать, что arrayFind правилен, мы индуктивно определяем ряд заявлений,

Σi, которые приводят к правильности нашего алгоритма. Определенно, мы требуем следования -

луг верен в начале повторения i из в то время как петля:

Σi: x не равен ни одному из первых я элементы A.

Это требование верно в начале первого повторения петли, так как есть

никакие элементы среди первого 0 в (этот вид тривиально истинного требования, как говорят, держится праздным образом). В повторении i, мы сравниваем элемент x с элементом [я] и возвращаем индекс i, если эти два элемента равны, который ясно правилен и заканчивает алгоритм в этом случае. Если эти два элемента x и [я] не равны, то мы сочли еще один элемент не равным x, и мы увеличиваем индекс i. Таким образом,

требованиеΣi верно для этой новой ценности меня; следовательно, это верно в начале следующего

повторение. Если в-то-время-как-петля заканчивается, никогда не возвращая индекс в A, то мы

имейте меня = n. Таким образом,Σn верен - нет никаких элементов равного x. Поэтому,

алгоритм правильно возвращается-1, чтобы указать, что x не находится в A.