我正在研究一些递归的东西。我已经在十二天的圣诞节中创造了一些函数,但是我想不出一种使用输入来调用函数的方法。我举个例子:
def day1():
print 'A Partridge in a Pear Tree'
def day2():
print '2 Turtle Doves'
day1()
def day3():
print '3 French Hens'
day2()
我尝试在诸如
之类的函数中使用if语句def DaysOfXmas(n):
if n == 1:
day1()
if n == 2:
day2()
if n == 3:
day3()
但这感觉就像是一种可怕而混乱的方式。 有什么建议吗?
答案 0 :(得分:2)
嗯,你可以做globals()['day%d' % n]()
,但那更加可怕和混乱。
将函数放入集合中。例如,如果需要稀疏或非整数键,则为列表或dict。 day_funcs = [day0, day1, day, day3]
(day0
应该是一个占位符,如果你在盲目获取项目并调用它之前检查输入,则不可调用的工作 - 如果不是,用户会得到一个看似完全不相关的丑陋错误)并在调度程序中使用day_funcs[n]()
。您可以通过多种方式使其更加干燥:需要最后一次打字的那种(但也会因其他命名方案而倒下)将把函数(和仅那些)放入一个单独的模块中导入后,定义day_funcs = sorted(inspect.getmembers(the_module, isfunction))
。
答案 1 :(得分: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循环,该函数更容易编写(并且更有效)。
答案 2 :(得分:0)
递归背后的想法是你在任意输入上都有一组一致的操作,并设置一个或多个可能做一些特殊操作的基本情况,并结束递归调用。
如果你想为12个输入值做一些不同的事情,可以考虑使用给定输入的输出映射(然后用递减的输入值再次调用该函数),或者你有12个基本情况。