2014-11-05 56 views
-2

我用Python編寫了一個程序,該程序旨在查找描述一組數字的公式。無論如何,這個公式可以很好地應用於「玩得很好」的小數字(例如,它會處理[1, 5, 7, 4]就好)。但是,當您給它過大([10, 42, 20, 42, 30, 42])時,它很快會引發異常(RuntimeError: maximum recursion depth exceeded in comparison)。現在,當我調試這個時,我發現我看到有點有損轉換加倍(對於這組數字,nval,在第二次迭代中,-611.8000000000000001)。當然,這會使事情全部錯誤並無限遞歸。現在,我意識到我的程序可能是蹩腳的BEYOND BEYOND有損轉換,我也喜歡你有任何提示,但有沒有人有任何想法來解決這個問題?有損轉換問題Python

代碼(按@ jonrsharpe的評論,這是簡單的,因爲我可以把它在不犧牲可讀性):

import math 

def getdeg(numlist, cnt): 
    if allEqual(numlist): 
     return (0, numlist[0]) 

    count = cnt 
    templist = [] 
    for i in range(len(numlist) - 1): 
     templist.append(numlist[i+1] - numlist[i]) 
    count += 1 
    if not allEqual(templist): 
     return getdeg(templist, count) 
    else: 
     return (count, templist[0]) 

def allEqual(numlist): 
    x = len(numlist) 
    if x == 1: 
     return True 
    for i in range(x-1): 
     if not (numlist[i] == numlist[i+1]): 
      return False 
    return True 

def getTerms(numlist, terms, maxpower): 
    newtable = [] 
    power, fval = getdeg(numlist, 0) 
    if maxpower == 0: 
     maxpower = power 
    terms.append(fval/float(math.factorial(power))) 
    if not power == 0: 
     for i in range(len(numlist)): 
      nval = numlist[i] - (terms[maxpower - power] * ((i + 1) ** power)) 
      newtable.append(nval) 
     return getTerms(newtable, terms, maxpower) 
    return terms 

def printeq(numlist): 
    #numlist = [2, 8, 9, 11, 20] 
    print("Coeff\tPower") 
    x = getTerms(numlist, [], 0) 
    topPow = len(x) - 1 
    for i in range(len(x)): 
     print(str(x[i]) + "\t" + str(topPow)) 
     topPow -= 1 

printeq([10, 42, 20, 42, 30, 42]) 
+2

如果是* 「有點冗長」 *,**你**應該剪下來[最小示例](http://stackoverflow.com/help/mcve)。 – jonrsharpe 2014-11-05 14:28:12

+0

@jonrsharpe好的,我剪出了一個方法,允許您輸入數字,取出註釋,並實現該功能,因此無法工作。你有什麼想法我做錯了嗎?或者你可以改進這個問題? – KnightOfNi 2014-11-05 14:36:04

+0

也許「分數」模塊對你有用。它可以準確地表示任何實數,不需要有損轉換。 – Kevin 2014-11-05 14:44:20

回答

1

也許fractions模塊將是對你有用。它可以準確地表示任何實數,不需要有損轉換。我不太明白你的代碼在做什麼,但我認爲你可以通過在你的腳本的頂部放置import fractions來改變一個現有的行來加入分數。在getTerms

terms.append(fval/float(math.factorial(power))) 

成爲

terms.append(fractions.Fraction(fval,math.factorial(power))) 

那麼你的程序沒有崩潰運行:

Coeff Power 
13/5 5 
-139/3 4 
932/3 3 
-2900/3 2 
20576/15  1 
-662 0 
+0

美麗。再次感謝! – KnightOfNi 2014-11-05 14:55:21