2011-02-14 165 views
1

我工作的一些東西遞歸函數。我在十二天的聖誕節中創建了一些函數,但我想不出使用輸入來調用函數的方法。我舉一個例子:遞歸調用使用輸入

def day1(): 
    print 'A Partridge in a Pear Tree' 
def day2(): 
    print '2 Turtle Doves' 
    day1() 
def day3(): 
    print '3 French Hens' 
    day2() 

我試着去使用的途徑,如果一個函數如

def DaysOfXmas(n): 
    if n == 1: 
     day1() 
    if n == 2: 
     day2() 
    if n == 3: 
     day3() 

內聲明,但這種感覺就像做這件事的恐怖和混亂的方式。 有什麼建議嗎?

+1

我沒有看到任何遞歸在你的例子 – 2011-02-14 17:41:59

回答

2

那麼,你可能globals()['day%d' % n](),但這是更可怕和凌亂。

只需將功能集成到一個集合。例如,一個列表或字典,如果你需要稀疏或非整數密鑰。 day_funcs = [day0, day1, day, day3]day0應該propably是一個佔位符,一個不可贖回的作品,如果你一味地獲得該項目,並調用它之前檢查輸入 - 如果不是,用戶得到一個醜陋的錯誤,似乎完全無關),並在調度員使用day_funcs[n]()。您可以在幾個方面,這更加乾燥:需要最後輸入的內容(但也倒下了其他命名方案)將被放置的功能(和那些)成一個單獨的模塊,導入它們後,定義day_funcs = sorted(inspect.getmembers(the_module, isfunction))

2
days = ['A Partridge in a Pear Tree', 
     '2 Turtle Doves', 
     '3 French Hens'] 

def sing(n=0): 
    print days[n] 
    try: 
     sing(n+1) 
    except IndexError: 
     return 

這是遞歸循環的一個簡單示例。不過,除了理解它之外,不要用Python來完成它。用for循環寫這個函數更容易(而且效率更高)。

0

遞歸背後的想法是,你有一個一致的,你在任意的輸入進行操作,並設置一個或多個基站的情況下,將可能做一些特別的東西,並結束遞歸調用。

如果您想爲12個輸入值做一些不同的事情,請考慮使用給定輸入的輸出映射(然後再次以遞減的輸入值調用該函數),或者您有12個基本情況。