2011-02-14 169 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个基本情况。