2012-01-16 11 views
7

Ho la sensazione che mi manca qualcosa di piuttosto semplice qui, ma, in questa funzione:Sintassi non valida in "per la voce a L" loop

def triplets(perimeter): 

    triplets, n, a, b, c = 0 #number of triplets, a, b, c, sides of a triangle, n is used to calculate a triple 
    L = primes(int(math.sqrt(perimeter)) #list of primes to divide the perimeter 

    for item in L: #iterate through the list of primes 
     if perimeter % item == 0: #check if a prime divides the perimeter 
      n = perimeter/item 
      a = n**2 - (n+1)**2 #http://en.wikipedia.org/wiki/Pythagorean_triple 
      b = 2n*(n+1) 
      c = n**2 + n**2 
      if a+b+c == perimeter: #check if it adds up to the perimeter of the triangle 
       triplets = triplets + 1 

    return triplets 

sto ottenendo l'errore:

for item in L: 
       ^
SyntaxError: invalid syntax 

Per completezza il mio intero programma si presenta così:

import math 

def primes(n): #get a list of primes below a number 
    if n==2: return [2] 
    elif n<2: return [] 
    s=range(3,n+1,2) 
    mroot = n ** 0.5 
    half=(n+1)/2-1 
    i=0 
    m=3 
    while m <= mroot: 
     if s[i]: 
      j=(m*m-3)/2 
      s[j]=0 
      while j<half: 
       s[j]=0 
       j+=m 
     i=i+1 
     m=2*i+3 
    return [2]+[x for x in s if x] 

def triplets(perimeter): 

    triplets, n, a, b, c = 0 #number of triplets, a, b, c, sides of a triangle, n is used to calculate a triple 
    L = primes(int(math.sqrt(perimeter)) #list of primes to divide the perimeter 

    for item in L: #iterate through the list of primes 
     if perimeter % item == 0: #check if a prime divides the perimeter 
      n = perimeter/item 
      a = n**2 - (n+1)**2 #http://en.wikipedia.org/wiki/Pythagorean_triple 
      b = 2n*(n+1) 
      c = n**2 + n**2 
      if a+b+c == perimeter: #check if it adds up to the perimeter of the triangle 
       triplets = triplets + 1 

    return triplets 

def solve(): 
    best = 0 
    perimeter = 0 
    for i in range(1, 1000): 
     if triplets(i) > best: 
      best = triplets(i) 
      perimeter = i 
    return perimeter 

print solve() 

sto usando Python 2.7.1. Ho un punto e virgola dopo il ciclo for, la funzione primes(n) funziona, ho la sensazione che sia probabilmente qualcosa di stupido ma non riesco a capire cosa stia causando questa sintassi non valida.

+0

parentesi nella riga 'L = ...' –

risposta

13

vi manca una parentesi di chiusura sulla linea prima:

 L = primes(int(math.sqrt(perimeter)) #list of primes to divide the perimeter 
#    ^^  ^  ^^ 
#nesting count 1 2   3   21 

Guarda come non raggiungiamo 0 nel "conteggio nesting" sotto la linea?

+0

Spara. Sapevo che era qualcosa di semplice. Così imbarazzato. Haha. Grazie. – Dair

+0

Vorrei solo commentare: ho fatto altri due errori (che ho scoperto più tardi): 'b = 2n * (n + 1)' dovrebbe essere 'b = 2 * n * (n + 1)' anche, avevo bisogno per inizializzare le terzine, a, b, c e n in modo diverso. – Dair

0

C'è un errore nella linea prima che:

L = primes(int(math.sqrt(perimeter)) 

Hai 3 parens aperte, ma solo due parentesi di chiusura.

0

L'errore è nella riga sopra - vi state perdendo una stretta fascia:

L = primes(int(math.sqrt(perimeter))) 
1

Stai manca una parentesi:

L = primes(int(math.sqrt(perimeter))) 
            ^
            | 
           this one 

Questo succede a me tutte le volte, è solo bisogno di guardare la linea prima.

Problemi correlati