2010-01-17 114 views
3

我不明白爲什麼這個python函數返回無,如果它遞歸調用自己。遞歸返回無Python函數

這是我解決項目歐拉問題的一部分。無論如何,我已經以更好的方式解決了這個問題,但是這仍然讓我很煩惱,因爲這個函數似乎可以正常工作 - 而且它似乎知道我想要返回的變量的值。

def next_prime(previous): 
    if previous % 2 == 0: 
     candidate = previous + 1 
    else: 
    candidate = previous + 2 
    print "trying", candidate 
    prime = True 
    for div in range(2,candidate//2,1): 
     if candidate % div == 0: 
      prime = False 
      print candidate, "is not prime - divisible by", div 
      next_prime(candidate) 
      break 
    if prime is True: 
     print candidate, "is prime" 
     #return candidate 

last = 896576 
print "After", last, ", the next prime is..." 
next_prime(last) 

這給:

After 896576 , the next prime is... 
trying 896577 
896577 is not prime - divisible by 3 
trying 896579 
896579 is not prime - divisible by 701 
trying 896581 
896581 is not prime - divisible by 7 
trying 896583 
896583 is not prime - divisible by 3 
trying 896585 
896585 is not prime - divisible by 5 
trying 896587 
896587 is prime 

但是,如果我去掉了return語句,如果第一次嘗試是素數只返回一個值,否則返回無。

+0

你沒有使用遞歸調用的值,這是正常的嗎? – Tobu 2010-01-17 21:10:44

回答

6

你忘了返回一個值,當出現故障時找到一個素數:

for div in range(2,candidate//2,1): 
    if candidate % div == 0: 
     prime = False 
     print candidate, "is not prime - divisible by", div 
     return next_prime(candidate) 

遞歸是不是真的適合這裏雖然。它並不比簡單的迭代方法更優雅。另外,如果你碰到兩個連續的素數之間有很多非素數的區域,你可能會溢出堆棧。

+0

+1最後一段。 – 2010-01-17 21:18:41

0

請注意,您正在對next_prime函數進行遞歸調用,但不會從調用函數返回值。

更換線路:

print candidate, "is not prime - divisible by", div 
next_prime(candidate) 

print candidate, "is not prime - divisible by", div 
return next_prime(candidate) 
1

正如其他人所說,這是不是真的遞歸的地方。這是一個使用迭代的例子。我還定義了另一個測試整數的素數的函數 - 我認爲這使得代碼更簡單。

def is_prime(n): 
    """Return True if n is prime.""" 
    for i in xrange(2, n//2): 
     if n%i == 0: 
      return False 
    return True 

def next_prime(n): 
    """Returns the next prime number after n.""" 
    if n % 2 == 0: 
     candidate = n + 1 
    else: 
     candidate = n + 2 
    while not is_prime(candidate): 
     candidate += 2 
    return candidate 

if __name__ == '__main__': 
    n = 896576 
    print next_prime(n) 
+0

是的 - 我意識到這是做到這一點的方法,我以類似的方式解決了這個問題,我看不出我做錯了什麼,所以我給了馬克的正確答案,馬克是第一個指出我的錯誤。儘管如此,非常感謝。 – 2010-01-17 21:43:21