как каждый раз рекурсивно вызывать один и тот же код в одной и той же функции - PullRequest
1 голос
/ 21 марта 2012

У меня есть такой код, где 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+d.И значения r и d даны в dict d, и мне нужно добавить это значение rrr, a, b к 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 голосов
/ 21 марта 2012

Если я правильно понимаю, вы хотите вызывать некоторый код рекурсивно при определенных условиях.Ваш код не очень понятен, поэтому я просто дам общий совет.Если вы хотите вычислить значение в условии, но само вычисление должно быть выполнено рекурсивно, тогда вы должны переместить рекурсивный код в отдельную функцию.Эта отдельная функция может затем вызывать себя рекурсивно.Например:

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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...