2013-08-23 35 views
5

Tôi đang thực hành Python với Project Euler, câu hỏi 1, nhưng hàm tôi viết để giải quyết nó mất quá nhiều thời gian.Chức năng chạy theo cách quá chậm

Tôi hiểu đó là vì cách tôi mã hóa nó không phải là phương thức thực tế.
Khi tôi chạy chức năng này với 10 hoặc 15 lần lặp, nó sẽ đưa ra câu trả lời ngay lập tức, nhưng ngay sau khi tôi nhảy lên đến 20, nó không hiển thị cho tôi bất cứ điều gì trong vài phút.
Điều này rõ ràng là một vấn đề lớn nếu tôi cần đến 1000 lần lặp lại.

def pe1(n): 
    counter = 1 
    total = 0 
    while counter < n: 
     if counter%3==0: 
      total=total+counter 
     if counter%5==0: 
      if counter%3==0: 
       continue 
      total=total+counter 
     if counter % 25 == 0: 
      print (total) 
     counter=counter+1 
    return (total) 

Trả lời

2

Hãy xem xét các trường hợp nếu counter bằng 15 và nhìn vào những gì xảy ra nơi counter%5==0counter%3==0, mà đầu tiên sẽ diễn ra tại thời điểm đó.

Cân nhắc điều gì sẽ không xảy ra với giá trị đó là counter, cụ thể là dòng counter=counter+1 sẽ không được thực thi.

6

Bởi vì ngay sau khi counter lượt truy cập 15, vòng lặp của bạn đi vào một số vô hạn continue - luôn luôn nhấn trường hợp câu lệnh thứ hai if thứ hai.

Bạn cần di chuyển dòng counter = counter + 1 trước khi tiếp tục hoặc tốt hơn, sử dụng một cái gì đó như for counter in range(1,n).

1

Để tránh bẫy như thế này, hãy xem xét sử dụng

if ... 
elif ... 
elif ... 
else ... 
0

Bạn có thể sử dụng bảng điều khiển. Như thế này.

counter_map = {3:fun1, 5:func2, 25:fun3} # key is remainder.Of course,fun can be replaced with lambda. 
Các vấn đề liên quan