почему это бесконечный цикл в питоне? - PullRequest
7 голосов
/ 12 января 2010

Кажется, я не могу понять, почему в питоне это бесконечный цикл ??

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

не должен внешний цикл идти n раз. увеличивать j, пока оно не станет равным n div i каждый раз?

Ответы [ 9 ]

36 голосов
/ 12 января 2010

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

16 голосов
/ 12 января 2010

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

  1. n = 5; я = 0
  2. n = 5; я = 0; j = 1
  3. i * j 0 <5: n = 5; я = 0; j = 2 </li>
  4. i * j 0 <5: n = 5; я = 0; j = 3 </li>
  5. i * j 0 <5: n = 5; я = 0; j = 4 </li>
  6. i * j 0 <5: n = 5; я = 0; j = 5 </li>
  7. i * j 0 <5: n = 5; я = 0; j = 6 </li>

и т.д.

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

В случае сомнений распечатайте его.

12 голосов
/ 12 января 2010

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

7 голосов
/ 12 января 2010

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

4 голосов
/ 12 января 2010

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

2 голосов
/ 12 января 2010

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

2 голосов
/ 12 января 2010

потому что мне 0! и я * J = 0

1 голос
/ 12 января 2010

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

0 голосов
/ 12 января 2010

я равно 0 переписать ваш цикл, как

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

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

...