C # - для петли замерзает через странные промежутки времени - PullRequest
1 голос
/ 06 июля 2010

Я работаю над Задачей 14 в Project Euler, и кажется, что мой код зависает через произвольные промежутки времени без видимой причины.

static void Main()
{
    int maxNum = 0;
    int maxLength = 0;
    for (int x = 2; x < 1000000; ++x)
    {
        int num = x;
        int length = 0;
        while (num != 1)
        {
            if (num % 2 == 0)
            {
                num /= 2;
                length++;
            }
            else
            {
                num = (3 * num) + 1;
                length++;
            }
       }
       if (length > maxLength)
       {
            maxLength = length;
            maxNum = x;
       }
    }
    Console.WriteLine(maxNum);
    Console.ReadLine();

Число, на котором висит программа, меняется каждый раз, когда я ее запускаю, и, похоже, не следует установленным шаблонам. Любые идеи о том, почему это будет висеть так? Заранее спасибо.

Ответы [ 3 ]

4 голосов
/ 06 июля 2010

Я решил это по-другому, кэшируя результат для каждого шага, и я нашел вашу проблему.Я сомневаюсь, что ваша программа когда-либо останавливается.
Оператор num = (3 * num) + 1 может переполниться через Int32.MaxValue и привести к отрицательному числу и бесконечному циклу (?).
В этом случае вы можете решить проблему с помощью long для вашего х.

0 голосов
/ 06 июля 2010

Могу поспорить, что эта версия не зависает, нет причины, по которой она должна это делать.

Последовательности Коллатца, прежде чем вы нажмете 1 во внутреннем цикле while, слишком короткие, чтобы привести к заметной задержке, иесли они будут, это всегда должно происходить с одинаковыми номерами.

Если вы добавите консольный вывод в цикл, это может выделить память, и паузы, которые вы видите, могут быть вызваны сборкой мусора.

0 голосов
/ 06 июля 2010

Если переходит в бесконечный цикл в while (num != 1).

...