2017-01-05 6 views
0

я написать функцию Ей, которая принимает код последующих псевда и определяет, является ли он бесконечный циклом:используя логическое значение, чтобы определить, является ли процесс представляет собой бесконечный цикл в C#

while a is not equal to b do 
    increase a by 1 
    decrease b by 1 

В настоящее время у меня следующее решение:

bool isInfiniteProcess(int a, int b) {  
    return (b == a || b - 1 > a) ? false : true; 
}  

Когда я рассмотреть все возможные условия можно найти условие это будет работать для меня, но стендовое скрытых решений говорит, что это неправильно. Есть что-то, что мне не хватает? Есть ли функция сборки или библиотека, которую я могу использовать для этого в C#?

+1

Ваш метод потерпит неудачу в случае 'а = 1, Ь = 4'. шаги; 'a = 1, b = 4'' a = 2, b = 3', 'a = 3, b = 2',' a = 4, b = 1' .. и так далее. Это, вероятно, лучше подходит для другого сайта, но это не вопрос программирования, это логический вопрос. – Rob

+0

Я в замешательстве. Вы пытаетесь обнаружить бесконечные циклы в общем случае или в особых случаях? (Если это первый, это невозможно). – EJoshuaS

+0

'(b - a)% 2! = 0' на основе того, что показал Роб в качестве примера. –

ответ

0

Это будет бесконечно, если два числа никогда не подходят друг к другу.

a всегда увеличивается на 1, b всегда уменьшается на 1

Первый случай:

A == B

второй случай:

Если они оба положительны то они будут равны друг другу, если b не менее чем на 2 больше, чем a и сумма a и b делится на 2: Итак, второе условие:

(ба)> = 2 & & ((Ь + а)% 2 == 0)

третий случай:

Оба отрицательные, поэтому a будет увеличиваться, а b будет меньше. Это же правило применяется как второй случай, но мы принимаем абсолютное значение, поэтому мы можем сделать второй случай таким образом, и он будет работать как для 2-го, так и для третьего случая:

(abs (b) -abs (a))> = 2 & & ((абс (б) + ABS (а)% 2 == 0)

4-ый Корпус:

a является отрицательным и положительным b является: Они будут равны, если сумма абсолютного значения от a и b делится на 2:

(абс (а) + б)% 2 == 0

пятого корпуса:

a является положительным и отрицательным b является: a будет увеличиваться и уменьшаться b будет, как это на числовой прямой:

<- b   a -> 
<---------|----------> 

Поскольку они уходят друг от друга, они никогда не будут равны.

Все случаи с C# код:

bool isInfiniteProcess(int a, int b) { 
    // Case 1 
    if(b == a) 
     return false; 

    // Case 2 and 3 
    bool bothNegative = (a < 0 && b < 0); 
    bool bothPositive = (a > 0 && b > 0); 
    if (bothNegative || bothPositive) { 
     if((Math.Abs(b) - Math.Abs(a)) >= 2 && ((Math.Abs(b) + Math.Abs(a) % 2 == 0))) 
     return false; 
    } 


    // Case 3 
    if (a < 0 && b > 0) { 
     if((Math.Abs(a) + b) % 2 == 0) 
     return false; 
    } 

    return true; 
} 

Не тестировался, мне нужно ехать домой ...

+1

Или потенциально просто 'return b Rob

+0

@Rob, это довольно сексуально, я должен сказать :) поэтому вместо равенства вы пошли на неравенство. Я получаю первое условие, и все это будет работать, но как вы пришли к 2-му действию? Это имеет смысл, но как вы пришли к этому, и есть ли причина, по которой вы пошли на неравенство? Очень здорово, хотя я должен сказать. – CodingYoshi

+1

@ Робовое решение работает на моей тестовой площадке :) Хотя я все еще не совсем уверен, в каком случае ваш код обрабатывает то, что у моего оригинального решения нет. Что возвращает мое решение (b == a || b - 1> a)? false true; не ручка? –