I can't seem to figure out why this is an infinite loop in python??
for i in range(n):
j=1
while((i*j)<n):
j+=1
shouldn't the outer loop go n times. incrementing j until开发者_Python百科 its equal to n div i each time?
i
starts at 0
, so the while
condition stays always true; see the range docs for details.
You can create a "trace" showing the state changes of the variables.
- n= 5; i= 0
- n= 5; i= 0; j= 1
- i*j < n -> 0 < 5: n= 5; i= 0; j= 2
- i*j < n -> 0 < 5: n= 5; i= 0; j= 3
- i*j < n -> 0 < 5: n= 5; i= 0; j= 4
- i*j < n -> 0 < 5: n= 5; i= 0; j= 5
- i*j < n -> 0 < 5: n= 5; i= 0; j= 6
etc.
You can prove that your trace is correct by inserting print
statements.
When in doubt, print it out.
i
starts at zero, so the condition for the inner loop is always 0*j < n
, which will always be true.
Because the initial value of i
is 0.
The first value in i
will be 0. 0 times anything is 0.
because i is 0!! and i*j=0
range(n)
starts at 0
, not 1
. 0 * j
will always be less than n
.
On the first time through the outer loop, the inner loop becomes an infinite loop. It doesn't matter what happens after that. There's no "after infinity".
i is 0 rewrite you loop like
for i in range(1,n):
j=1
while((i*j)<n):
j+=1
using this version of the range function will create a range that starts at 1 instead of 0
精彩评论