2016-04-30 56 views
1

有人可以解釋爲什麼這代碼,是用樣本數13195,但崩潰時我用的是問題的數量項目歐拉數3

num = 13195 

def isprime(num): 
    for i in range(2,num): 
    if num % i == 0: 
     ans = i 
    return ans 

print isprime(isprime(isprime(num))) 
+1

你爲什麼要調用'isprime(isprime(isprime(num)))'?它不應該只是一個電話嗎? –

+1

你可以引用這個作業嗎?你是否考慮過輸入'num = 1':它會返回'None' ... –

+0

因爲效率太低,找到另一種算法(例如:https://en.wikipedia.org/wiki/Sieve_of_Eratosthenes) – Ouss4

回答

0

您需要將默認值賦給ans

當輸入號碼是質數時,程序從不將任何內容分配給變量ans。所以,當函數試圖返回這個變量時,它實際上並沒有被定義。

+0

這不是OP一直存在的問題。輸入數字非常大,函數沒有返回'ans'。 –

+0

這是一個很好的觀點,是真的。但'13195'不足以產生這個問題。 – JoseKilo

+0

這就是爲什麼他說它適用於13195.問題號碼是600851475143. –

2

在Python 2中,range構造一個列表。所以這個程序試圖在內存中包含一個巨大的列表,但它不能。使用xrange這將生成迭代的需求數量,而不是一次。

您還需要儘早結束循環,否則它將花費永遠檢查如此多的數字。所以一旦找到一個除數,就用它來分割原來的數字,並使它變小,因而易於管理。