2011-06-28 24 views
-1

我正在查詢某個參數的數據庫,這些參數取決於稱爲count的屬性! count可以遞增,因爲第一個查詢不返回任何內容。下面是一個示例代碼python,如何編寫一個迭代函數

sls = {(213.243, 55.556): {}, (217.193, 55.793): {}, (213.403, 55.369): {}} 

for key in sls.keys: 
    if not sls[key]: 
    ra, dec = key[0], key[1] 
    search_from_sourcelist(sl, ra,dec) 

count = 1 
def search_from_sourcelist(sl, ra,dec): 
    dist = count/3600.0 
    sls[(ra,dec)] = sl.sources.area_search(Area=(ra,dec,dist)) 
    return 

櫃面我運行的方法search_from_sourcelist,並且它不返回任何東西,我想增加count,並再次進行查詢。這是要做的所有鍵在SLS詞典,直到所有的鍵都有一個值!

+0

你沒有的功能在你的代碼調用自身的任何地方,所以我不知道你明白什麼「遞歸」的意思。 – geoffspear

+0

@Wooble,那正是我想要做的! – user739807

+0

看看我的編輯 –

回答

3

這是最根本的遞歸函數

def countdown(n): 
    if n == 0: 
     return "Blastoff" 
    else: 
     print "T minus %s" % n 
     return countdown(n-1) 

你會發現,倒計時返回本身就帶有修改參數,在這個情況下,n -1,但是,如果你實際上是通過你會遵循這一路得到 ( - >指示呼叫)

countdown(5) -> countdown(4) -> countdown(3) -> countdown(2) -> countdown(1) -> countdown(0) #stop 

所以現在你明白一個遞歸函數是什麼樣子,你知道你從來沒有真正回到自己的函數調用,因此你的代碼是不是遞歸

我們使用遞歸是因爲我們想把一個任務歸結爲最簡單的形式,然後從那裏開始工作,所以一個很好的例子就是mcnuggets問題。所以你需要告訴我們你想要達到的目標以及如何將它變成一個小問題(或者更重要的原因)。你確定你不能迭代地做到這一點嗎?請記住,您不想吹出堆棧深度,因爲python不是標準的遞歸尾遞歸

+0

我知道這個事實,沒有遞歸,這就是我需要幫助! – user739807

+0

完美,我想要一個迭代方法不遞歸! – user739807

1

當您找到一種方法將初始問題簡化爲「自身的較小版本」時,遞歸非常有用。

標準的例子是階乘函數

def fac(n): 
    return n * fac(n-1) if n > 1 else 1 

在這裏,您減少計算n的階乘計算n-1階乘的問題。

在你的代碼中沒有這種「減少」。您只需增加一個值並重新開始相同的問題。因此,我建議你反覆解決它。

+0

哦,是的,我其實不需要recusion!謝謝 – user739807

1

我不確定你需要遞歸算法。

Incase i run the method search_from_sourcelist, and it doesnt return anything, i would like to increment count, and do the query again。這可以用while循環來完成如下:

for key, value in sls.iteritems(): 
    if not value: 
     ra, dec = key[0], key[1] 
     count = 1 
     while not search_from_sourcelist(sls, ra, dec): 
      count += 1 

但是,如果你確實想遞歸地做到這一點,你可以做如下,發表評論,我將它寫上去。

此外,你應該看看你的search_from_sourcelist功能,因爲它總是返回None