2014-03-04 16 views
2

試圖找到兩個三位數字乘積的最大回文。在查找無限效率和更重要的工作解決方案之前,能否告訴我我的代碼有什麼問題?我只是不斷收到空集。python中的迴文數字

def palindrome(): 
    n = 100 
    m = 100 
    palind = [] 
    while n<=999: 
     while m<=999: 
      prod = n * m 
      if str(prod) == str(prod)[::-1] and prod > palind[0]: 
       palind.pop(0) 
       palind.append(prod) 
      return palind 
      m = m + 1 
     n = n + 1 
     return palind 

print palindrome() 
+1

如果您使用像PyCharm這樣的工具,它將使調試這樣的工具變得更容易。 – Ron

回答

3

你有3個問題。

問題1:提前回歸。

while n<=999: 
    while m<=999: 
     prod = n * m 
     if str(prod) == str(prod)[::-1] and prod > palind[0]: 
      palind.pop(0) 
      palind.append(prod) 
     # Here 
     return palind 
     m = m + 1 
    n = n + 1 
    # And here 
    return palind 

一個return聲明表示該功能已經結束現在。它停止它的位置,調用者獲取返回值,並且調用者繼續前進。你不想這樣做,直到功能完成其工作。當函數完成計算後,讓我們將return移至循環之後。

問題2:palind[0]未初始化。

while n<=999: 
    while m<=999: 
     prod = n * m 
     #           Here v 
     if str(prod) == str(prod)[::-1] and prod > palind[0]: 
      palind.pop(0) 
      palind.append(prod) 
     m = m + 1 
    n = n + 1 
return palind 

假設你的程序正在進行並找到它的第一個迴文。它試圖將其與palind[0]進行比較,但沒有palind[0]!你需要採取第一個迴文沒有試圖比較它不存在。我們來解決這個問題。

問題3:不重置m

palind = None 
while n<=999: 
    while m<=999: 
     prod = n * m 
     if str(prod) == str(prod)[::-1]: 
      if palind is None or prod > palind: 
       palind = prod 
     m = m + 1 
    n = n + 1 
return palind 

n循環的第一次迭代之後,你需要回到通過所有可能的m值與n=101。你不這樣做;你的代碼保持m1000,所以它不會再次通過內部循環。您可以明確重置m,但使用for循環代替while s要容易得多。在解決所有3個問題後,您的代碼看起來像

palind = None 
for n in xrange(100, 1000): 
    for m in xrange(100, 1000): 
     prod = n * m 
     if str(prod) == str(prod)[::-1]: 
      if palind is None or prod > palind: 
       palind = prod 
return palind 
1
  1. 你是不是重新初始化m = 100,外的每次迭代後while循環

  2. 你早日恢復。在內環

  3. 最後return聲明應是while循環外內取出return聲明。

  4. 你永遠不會初始化palind列表(感謝@ user2357112)

建議:

  1. 不要使用名單,以保持最大數量。一個簡單的變量就足夠了。

  2. 您不必在同一個表達式中將數字轉換爲字符串兩次。將字符串化的數字存儲在一個變量中。

  3. 使用range功能遍歷數字

如果我寫這個程序,我會做這樣的

from itertools import product 
def palindrome(): 
    numbers, result = range(1000, 100, -1), -1 
    for num1, num2 in product(numbers, repeat = 2): 
     prod = num1 * num2 
     sprod = str(prod) 
     if sprod == sprod[::-1] and prod > result: 
      result = prod 
    return result 

print palindrome() # 906609 
+0

這是大約3中的1個問題。 – user2357112

+0

@ user2357112希望我現在發現了所有三個;) – thefourtheye

+0

「palind [0]」未初始化。 (我在寫我的答案時將你的2和3作爲一個問題。) – user2357112

3

此快捷鍵時,它是不可能返回i * j>記錄最大並正確返回906609(注意,如果你使用python 2,下面的代碼對你有用,但是你更願意使用xrange而不是range來避免在內存中創建不必要的列表):

def palindrome(floor=0, upto=999): 
    ''' 
    return the largest palindrome product for all number from (but not including) 
    floor to (and including) upto 
    ''' 
    start = upto 
    largest = None 
    for i in range(start, floor, -1): # decreasing from upto 
     if i * upto < largest: # if True, impossible for higher product from combo 
      break 
     for j in range(start, i-1, -1): # decrease from upto to not including i-1 
      product = i*j 
      if str(product) == str(product)[::-1]: 
       if product > largest: 
        largest = product 
    return largest 

用法:

>>> palindrome(99,999) 
906609 
>>> palindrome(10,13) 
121 
>>> palindrome(0,10) 
9 

短切削性是重要,因爲如果給出一個非常大的數字,它可能需要一段時間來恢復:

>>> palindrome(upto=100000000) 
9999000000009999L 

我還創建了一個發電機擊中從0到999的每一個組合,並返回906609.

def palindrome(upto=1000): 
    return max(i*j for i in range(upto) for j in range(upto) 
       if str(i*j) == str(i*j)[::-1]) 

但運行此迴文時爲:

>>> palindrome(upto=100000000) 

完整的搜索將搜索所有億^ 2,走的時間太長了。

我第一次寫了它這樣的,這個想法,這將短切和避免循環訪問每一個可能的組合,但是這是不正確,則返回888888:

def palindrome(): 
    start = 999 
    largest = 0 
    for i in range(start, 0, -1): # decreasing from 999 
     if i * 999 < largest: 
      return largest 
     for j in range(start, i, -1): # decreasing from 999 to i 
      if str(i*j) == str(i*j)[::-1]: 
       largest = i*j 

它先乘999次999,然後998次999,然後

998*998 
997*999 
997*998 
997*997 
... 

但結果並不單調遞減(即,每一個結果是不能保證是比以前的小。)

+0

似乎現在就工作。包含下限的上限排他可能更有意義。 – user2357112