如何每次递归调用相同函数中的相同代码

时间:2012-03-21 07:36:13

标签: python dictionary

我有这样的代码,其中e是一个字典,d是另一个字典。

e = { 'rrr':
        { 'prefix'    : 'inr',
          'reference' : 'Inr',
          'decimal'   : 0,
          'formula'   : 'a+h',
          'm'         : '',
        },
      'a' : 
        { 'prefix'    : 'inr',
          'reference' : 'Inr',
          'decimal'   : 0,
          'formula'   : 'b+c',
          'm'         : '',
        },
      'b' :
        { 'prefix'    : 'inr',
          'reference' : 'Inr',
          'decimal'   : 0,
          'formula'   : 'r+d',
          'm'         : 'm',
        },
      'h' :
        { 'prefix'    : 'inr',
          'reference' : 'Inr',
          'decimal'   : 0,
          'formula'   : 'b+y',
          'm'         : 'm',
        }
    }


d = { 'r':
        { 'prefix'    : 'inr',
          'reference' : 'Inr',
          'decimal'   : 0,
          'curyear'   : 1,
          'prevyear'  : 1,
        },
      'd' : 
        { 'prefix'    : 'inr',
          'reference' : 'Inr',
          'decimal'   : 0,
          'curyear'   : 2,
          'prevyear'  : 3,
        },
      'c' : 
        { 'prefix'    : 'inr',
          'reference' : 'Inr',
          'decimal'   : 0,
          'curyear'   : 4,
          'prevyear'  : 5,
        }
    }

for k,v in e.iteritems():
    a = re.findall('\w+', e[k]['formula'])
    for i in range(0, len(a)):
        if not d.has_key(a[i]):
             if e.has_key(a[i]):
                 getValue2(e, a[i])

getvalue2是一个像这样的递归函数

def getValue2(e, key):
    b = re.findall('\w+', e[key]['formaula'])
    if e.has_key(b[i]):
        getValue2(e, key)
    values = [d[x]['prevyear'] if x in d else 0 for x in a]
    values1 = [d[x]['curyear'] if x in d else 0 for x in a]
    x2 = dict(zip(a, values))
    x3 = dict(zip(a, values1))
    d[k] = {
            'prefix'    : e[k]['prefix'],
            'reference' : e[k]['reference'],
            'decimal'   : e[k]['decimal'],
            'prevyear'  : eval(e[k]['formula'], x2),
            'curyear'   : eval(e[k]['formula'], x3),
           }

e dict有rrr个密钥,其公式值为a+h,其中a是dict e中的另一个密钥,公式值为b+c }和b是dict e中的另一个关键,公式值为r+drd值在dict d中,我需要将此rrrab值附加到dict,但值为没有正确添加,所以我使用上面的递归函数。

在上面的函数中,这个代码必须递归调用

values = [d[x]['prevyear'] if x in d else 0 for x in a] # I am checking if k in d store that value else 0
values1 = [d[x]['curyear'] if x in d else 0 for x in a]
x2 = dict(zip(b, values)) # I am creating dict of tag,values
x3 = dict(zip(b, values1))
d[k] = {
        'prefix'    : e[k]['prefix'],
        'reference' : e[k]['reference'],
        'decimal'   : e[k]['decimal'],
        'prevyear'  : eval(e[k]['formula'], x2),
        'curyear'   : eval(e[k]['formula'], x3),
       }

在这种情况下

b = re.findall('\w+', e[key]['formaula'])
if e.has_key(b[i]):
    getValue2(e, key)

但是这两个代码都是单一功能但我没有得到如何使用该代码......

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你希望在某种条件下递归调用某些代码。您的代码不是很清楚,所以我只是提供一般性的建议。如果您希望在条件下计算值但计算本身需要递归完成,那么您应该将递归代码移动到单独的函数中。然后,该单独的函数可以递归地调用自身。例如:

def func1(a, b, c):
    func2(a, b, c)

def func2(a, b, c):
    # do computation here
    if condition:        
        func2(a2, b2, c2) # recursive call here

请注意,您必须确保func2不会一直自行调用。递归确实必须在某个时刻结束(因此condition在某些时候需要False,但至少它是在每次递归调用时评估的)。您还可以使用return func2(a2, b2, c2)返回值。