views:

585

answers:

10

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 its equal to n div i each time?

+25  A: 

i starts at 0, so the while condition stays always true; see the range docs for details.

Michał Marczyk
Thanks for adding the link, T.J. :-)
Michał Marczyk
+4  A: 

Because the initial value of i is 0.

mobrule
+2  A: 

The first value in i will be 0. 0 times anything is 0.

Ignacio Vazquez-Abrams
+10  A: 

i starts at zero, so the condition for the inner loop is always 0*j < n, which will always be true.

sth
+1  A: 

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".

Matthias Wandel
+1  A: 
Yin Zhu
+1  A: 

range(n) starts at 0. 0*j will always be less than n.

Adam Crossland
A: 

He's right 0*j will always be 0.

deep rock
-1: "he's right"? You can upvote the "He" answer, rather then repeat it.
S.Lott
A: 

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

RHicke
+10  A: 

You can create a "trace" showing the state changes of the variables.

  1. n= 5; i= 0
  2. n= 5; i= 0; j= 1
  3. i*j < n -> 0 < 5: n= 5; i= 0; j= 2
  4. i*j < n -> 0 < 5: n= 5; i= 0; j= 3
  5. i*j < n -> 0 < 5: n= 5; i= 0; j= 4
  6. i*j < n -> 0 < 5: n= 5; i= 0; j= 5
  7. 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.

S.Lott
+1 for the 'When in doubt, print it out.'
Jayrox