2016-03-26 5 views
0

文字列を入力として使用する再帰(またはループ)関数を作成しようとしていますが、formate "(2(1)(3))"(ソートについて心配していませんそれを[2 [1] [3] [3] []]のようなバイナリツリーへのリストとして単純なものとして解釈します。ここまでは私がこれまでに取り組んだことはありますが、動作していません。ここで私はこれまで持っているものです:文字列入力からバイナリツリーを作成する

def subtrees(string): 
    tree = [] 
    for x in string: 
     if x == "(": 
      return tree.append(subtrees(string[1:])) 
     elif x == ")": 
      return tree 
     else: 
      tree.append(int(x)) 
      return tree.append(subtrees(string[1:])) 

広範なテストの後、私は2つの大きな誤りを発見しました。一つは、それが見つかっreturn後の最初の括弧を閉じたということではただではなく、全体で実行中の機能を(終了しますそのノードを終了する1つの再帰呼び出し)、そして何らかの理由で私が出力を印刷しようとすると、Noneが印刷されます。私は本当にここで失われているので、任意のヘルプ/ヒントは、評価されるだろう。

答えて

1

あなたの機能を持つ多くの問題があります。

  • list.appendは()あなたがunneccessarily再帰しているすべての条件(理由は上記の通常なし)
  • のために戻ってきているなし
  • を返しません要素の場合
  • 文字列のコピーを渡すので、再帰関数は外側の関数を進めません。文字列を繰り返し可能にします。

クイックフィックス:

def subtrees(string): 
    s = iter(string) 
    tree = [] 
    for x in s: 
     if x == "(": 
      tree.append(subtrees(s)) 
     elif x == ")": 
      return tree 
     else: 
      tree.append(int(x)) 
    return tree[0] 

>>> subtrees('(2(1)(3))') 
[2, [1], [3]] 
関連する問題