2013-03-22 4 views
0

Я изучаю инварианты цикла в настоящий момент, и у меня возникают проблемы с моим выбором для инварианта для алгоритма линейного поиска.Правильность алгоритма

Inpput: A[1 ... n] of integers, k an integer value 
Output: true if k belongs to A[1 ... n] false otherwise 

LSearch(A,k) 
i := 1 
found := false 
WHILE i<=n AND found=false DO 
    IF A[i] = k THEN 
    found := true 
    i:=i+1 
return found 

Утверждение, которое я выбираю это:

  • найдено содержит истинным или ложным, если к присутствует среди [1] и A [I]

Перед тем, первая итерация выполняется, потому что в то время в A [1] находится один элемент и найденный инициализируется как false.

После цикла i может быть равным i: = 1 найдено: = falseto n и/или найдено может быть истинным (пока условие), поэтому утверждение остается неизменным с учетом i < = n.
Считаете ли вы, что это может быть правильно?

+0

Почему бы не вернуть TRUE при обнаружении решения? –

+0

Код находится в моем учебнике. По вашему мнению, инвариант был бы другим, я думаю. – Daved

+0

Извините, не заметил «AND found = false» в условии while-loop –

ответ

-1

Утверждение верно, но также и бесполезно. found является логическим и будет содержать True или False, независимо от свойств A. Это не поможет вам доказать правильность вашего алгоритма.

Был ли этот вопрос с множественным выбором? Каковы были другие варианты?

+0

Нет других вариантов, Я сделал это утверждение. Я использовал это и работал с правилами вывода, чтобы сказать, что если утверждение истинно до и после кода, алгоритм правильный. В найденном случае неверен диапазон A [1] ... A [i] соблюдается как i = n (конец цикла вызывает условие while). Если это не является достаточным, что я должен использовать в качестве инварианта (свойства A [] вообще не связаны с булевым?) – Daved

+0

@Daved: попробуйте выяснить условия, когда найдено false. – Knoothe

Смежные вопросы