2012-03-21 19 views
1

私はeが1つのdictで、dがもう1つdictのようなコードを持っています。毎回同じ関数内の同じコードを再帰的に呼び出す方法

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辞書はrrrキーを有しており、それはa式値b+cbと辞書e内の1つの以上のキーが1以上である式値a+hを有するように再帰関数であります式の値r+dを持つdict eのキー。そしてrdの値はdict dにあり、これを追加する必要があります。この値はrrr,a,bですが、正しく値が追加されないため、上記の再帰関数を使用しています。

は、上記の関数では、このコードは、この条件

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] # 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), 
     } 

と呼ばれるようにしているが、両方のコードは、単一の関数であるが、私はそのコードを使用する方法を得ていないのです。..

+0

最初のコードスニペットでは、 'e'に' rrr'の引用符がありませんでしたか? –

+0

@JoachimPileborgが正しい。助けてください – user1182090

+0

トピックオフ...しかし、単一の文字変数名は、限られた範囲と意味を持つ単純なオブジェクトに与えられるべきです。 – Simon

答えて

0

私が正しく理解していれば、特定の条件の下で再帰的にいくつかのコードを呼び出すことになります。あなたのコードはあまり明確ではないので、私は一般的なアドバイスをします。条件のもとで値を計算したいが、計算自体を再帰的に行う必要がある場合は、再帰的コードを別の関数に移動する必要があります。その分離された関数は、それ自体を再帰的に呼び出すことができます。あなたはfunc2自体がすべての時間を呼び出して保持しないことを確認する必要があり

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 

注:たとえば。再帰はある時点で終了する必要があります(したがって、conditionはある時点でFalseになる必要がありますが、少なくとも再帰呼び出しごとに評価されます)。 return func2(a2, b2, c2)を使用して値を返すこともできます。

関連する問題