почему это - бесконечный цикл в Python?

Я, может казаться, не выясняю, почему это - бесконечный цикл в Python??

for i in range(n):
    j=1
    while((i*j)<n):
       j+=1

не был должен внешний цикл идти n времена. постепенное увеличение j до его равного n отделению i каждых раз?

7
задан Matt Phillips 12 January 2010 в 17:40
поделиться

9 ответов

I начинается в 0 , поэтому , в то время как , в то время как состояние остается всегда верным; См. Документы диапазона .

36
ответ дан 6 December 2019 в 04:44
поделиться

Вы можете создать «трассировку», показывающую состоятельные изменения переменных.

  1. n = 5; I = 0
  2. n = 5; I = 0; J = 1
  3. I * J 0 <5: N = 5; I = 0; j = 2
  4. i * j 0 <5: n = 5; I = 0; j = 3
  5. i * j 0 <5: n = 5; I = 0; j = 4
  6. i * j 0 <5: n = 5; I = 0; J = 5
  7. I * J 0 <5: N = 5; I = 0; j = 6

etc.

Вы можете доказать, что ваш след правильный, вставляя Print .

Когда сомневаетесь, распечатайте его.

16
ответ дан 6 December 2019 в 04:44
поделиться

ISO-IEC 9899 заявляет:

5,1,2,2,1 Запуск программы

Если значение argc больше нуля, строка, на которую указывает argv [0] , представляет имя программы; argv [0] [0] должен быть нулевым символом, если имя программы недоступно из среды хоста. Если значение argc больше единицы, строки, на которые указывает argv [1] - argv [argc-1] , представляют параметры программы .

Я также использовал:

#if defined(_WIN32)
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    return GetModuleFileNameA(NULL, pathName, (DWORD)pathNameCapacity);
  }
#elif defined(__linux__) /* elif of: #if defined(_WIN32) */
  #include <unistd.h>
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    size_t pathNameSize = readlink("/proc/self/exe", pathName, pathNameCapacity - 1);
    pathName[pathNameSize] = '\0';
    return pathNameSize;
  }
#elif defined(__APPLE__) /* elif of: #elif defined(__linux__) */
  #include <mach-o/dyld.h>
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    uint32_t pathNameSize = 0;

    _NSGetExecutablePath(NULL, &pathNameSize);

    if (pathNameSize > pathNameCapacity)
      pathNameSize = pathNameCapacity;

    if (!_NSGetExecutablePath(pathName, &pathNameSize))
    {
      char real[PATH_MAX];

      if (realpath(pathName, real) != NULL)
      {
        pathNameSize = strlen(real);
        strncpy(pathName, real, pathNameSize);
      }

      return pathNameSize;
    }

    return 0;
  }
#else /* else of: #elif defined(__APPLE__) */
  #error provide your own implementation
#endif /* end of: #if defined(_WIN32) */

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

-121--773100-

Первое значение в i будет 0. 0 умножить на все 0.

-121--3758879-

i начинается с нуля, поэтому условие для внутреннего цикла всегда 0 * j < n , которое всегда будет истинным.

12
ответ дан 6 December 2019 в 04:44
поделиться

i начинается с 0 , поэтому условие в то время как остается всегда верным; для получения дополнительной информации см. документы по диапазону .

-121--3758875-

ISO-IEC 9899 заявляет:

5,1,2,2,1 Запуск программы

Если значение argc больше нуля, последовательность, на которое указывает argv [0] , представляет собой имя программы; argv [0] [0] должен быть нулевым символом, если имя программы недоступно из среды хоста. Если значение argc больше единицы, то последовательности, на которые указывают argv [1] - argv [argc-1] , представляют параметры программы .

Я также использовал:

#if defined(_WIN32)
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    return GetModuleFileNameA(NULL, pathName, (DWORD)pathNameCapacity);
  }
#elif defined(__linux__) /* elif of: #if defined(_WIN32) */
  #include <unistd.h>
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    size_t pathNameSize = readlink("/proc/self/exe", pathName, pathNameCapacity - 1);
    pathName[pathNameSize] = '\0';
    return pathNameSize;
  }
#elif defined(__APPLE__) /* elif of: #elif defined(__linux__) */
  #include <mach-o/dyld.h>
  static size_t getExecutablePathName(char* pathName, size_t pathNameCapacity)
  {
    uint32_t pathNameSize = 0;

    _NSGetExecutablePath(NULL, &pathNameSize);

    if (pathNameSize > pathNameCapacity)
      pathNameSize = pathNameCapacity;

    if (!_NSGetExecutablePath(pathName, &pathNameSize))
    {
      char real[PATH_MAX];

      if (realpath(pathName, real) != NULL)
      {
        pathNameSize = strlen(real);
        strncpy(pathName, real, pathNameSize);
      }

      return pathNameSize;
    }

    return 0;
  }
#else /* else of: #elif defined(__APPLE__) */
  #error provide your own implementation
#endif /* end of: #if defined(_WIN32) */

А затем вы просто должны проанализировать последовательность, чтобы извлечь имя исполняемого файла из пути.

-121--773100-

Поскольку начальное значение i равно 0.

7
ответ дан 6 December 2019 в 04:44
поделиться

Потому что я 0 !! и я * j = 0

2
ответ дан 6 December 2019 в 04:44
поделиться

Мне 0 Перепишите, как будтовары, как

for i in range(1,n):
j=1
while((i*j)<n):
   j+=1

, используя эту версию функции диапазона, создаст диапазон, который запускается в 1 вместо 0

0
ответ дан 6 December 2019 в 04:44
поделиться

Первое значение в I будет 0 0 раза превышать 0.

4
ответ дан 6 December 2019 в 04:44
поделиться

диапазон(n) начинается с 0, а не с 1. 0 * j всегда будет меньше, чем n.

2
ответ дан 6 December 2019 в 04:44
поделиться

Впервые через внешний цикл внутренний цикл становится бесконечной петлей. Неважно, что происходит после этого. Там нет «после бесконечности».

1
ответ дан 6 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: