嘗試運行代碼來解決存檔的歐拉專案問題
如果我們列出所有 10 以下的自然數是 3 或 5 的倍數,我們會得到 3、5、6 和 9。這些倍數之和是 23。
找出 1000 以下所有 3 或 5 的倍數之和。
但我現在得到了一個叫做記憶體錯誤的東西。難道我做錯了什么?Pl。解釋。我的代碼-
def euler_1(n):
x=0
abc=[]
while x<n:
if x%3==0 or x%5==0:
abc.append(x)
x =1
else:
pass
return sum(abc)
uj5u.com熱心網友回復:
您需要確保每次迭代回圈時都增加計數器。否則,您將陷入非倍數并遇到無限回圈。
考慮以下情況。什么時候x=4:
if x%3==0 or x%5==0:
# evaluates to false
所以我們移動else陳述句并回傳到回圈的頂部。什么都沒有改變,所以 x 仍然是 4,這個程序無限重復。如果您設定使用 while 回圈,則需要x =1在所有情況下都移到ifs 之外:
def euler_1(n):
x=0
abc=[]
while x<n:
if x%3==0 or x%5==0:
abc.append(x)
x =1
return sum(abc)
但是,如果我可以提出幾個建議:首先,您不需要從 0 開始計數器,而是從您想要查找倍數的最小整數開始。對 0、1 和 2 進行迭代是沒有意義的,因為它們永遠不會計數。
其次,我建議使用 for 回圈或串列推導式,因為無論結果如何,它們都將負責在每個回圈中遞增計數器。確保將范圍的結尾設定為 ,n 1因為 Python 范圍是半開集,即不包括最后一個數字。
abc = sum([x for x in range(0, n 1) if x%3==0 or x%5==0)]
或者
abc=0
for x in range(0, n 1):
if x%3==0 or x%5==0:
abc = x
return abc
uj5u.com熱心網友回復:
只需使用串列理解并跳過 while 回圈和只會減慢速度的附加。
sum([x for x in range(1, 1000) if x%3==0 or x%5==0]) # -> 233168
uj5u.com熱心網友回復:
在 else 陳述句中,洗掉pass陳述句并寫入,x =1因為更新 x 與條件無關。如果在條件不滿足的情況下不更新 x 則條件將永遠不滿足并且回圈將繼續進行
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/315513.html
下一篇:創建直方圖以映射字符頻率
