Python函数使用存储其名称的字典以递归方式相互调用

时间:2016-09-30 08:25:45

标签: python recursion

我有以下情况:

  • 有多个函数,每个函数都接受某些参数
  • 他们以递归/迭代的方式相互调用,直到满足可从参数推断出的某些条件
  • 我可以在这些函数中执行if-elif,但由于这会在所有这些函数中导致很多if-elif,我认为我应该使用字典存储对这些函数的引用来反对它们的名称键然后散列到这个字典中(使用参数内容)来获取并调用要调用的函数。

问题在于,我无法在所有函数(所有函数将使用此字典)之前或在所有函数之后(如字典将使用所有这些函数)决定在何处定义该字典。

下面我试图模仿这个场景。我使用随机函数来决定调用哪个函数而不是从参数中推断它。我还使用recurCount来决定何时停止递归调用。

import random

# funcDict = {"fun1": fun1,
#             "fun2": fun2,
#             "fun3": fun3,
#             "fun4": fun4}

#Traceback (most recent call last):
#  File "C:\...\temp.py", line 107, in <module>
#    funcDict = {"fun1": fun1,
#NameError: name 'fun1' is not defined

funcList = ["fun1","fun2","fun3","fun4"]
recurCount = 5

def fun1():
    global recurCount
    print("fun1")
    if(recurCount == 0):
        return 
    else:
        recurCount= recurCount-1
        funcDict[random.choice(funcList)]()  #recursive call

def fun2():
    global recurCount
    print("fun2")
    if(recurCount == 0):
        return 
    else:
        recurCount= recurCount-1
        funcDict[random.choice(funcList)]()  #recursive call

def fun3():
    global recurCount
    print("fun3")
    if(recurCount == 0):
        return 
    else:
        recurCount= recurCount-1
        funcDict[random.choice(funcList)]()  #recursive call

def fun4():
    global recurCount
    print("fun4")
    if(recurCount == 0):
        return 
    else:
        recurCount= recurCount-1
        funcDict[random.choice(funcList)]()  #recursive call

fun1()

# funcDict = {"fun1": fun1,
#             "fun2": fun2,
#             "fun3": fun3,
#             "fun4": fun4}

#Traceback (most recent call last):
#  File "C:\...\temp.py", line 152, in <module>
#    fun1()
#  File "C:\...\temp.py", line 123, in fun1
#    funcDict[random.choice(funcList)]()
#NameError: name 'funcDict' is not defined

1 个答案:

答案 0 :(得分:0)

字典要求已定义函数,而对任何函数的第一次调用要求已定义字典。因此,您应该在之后定义所有函数定义 之前首次调用任何函数:

def fun1():
    ...

def fun2():
    ...

def fun3():
    ...

def fun4():
    ...

funcDict = {"fun1": fun1,
            "fun2": fun2,
            "fun3": fun3,
            "fun4": fun4}

fun1()