2017-06-02 26 views
1

文字列にグラフを描画するコマンドを追加したいと思います。したがって、私は再帰関数を書いた。Pythonで文字列に再帰的に行を追加する

def draw(root,string): 
    string += 'Commands to draw the root' 
    if root.left != None: 
     string += 'Commands to draw a left child' 
     draw(root.left,string) 

    if root.right != None:...#same as for the left child 

私は混乱しています。私はこのような機能を使用している場合は、私の文字列doesntの変更は:

>>>a = '' 
>>>draw(root,a) 
>>>print(a) 
>>>a 
'' 

は、私が「戻り文字列」を追加しようとしましたが、その場合には、私の機能は、そのその左と右のルートを、図面で行われた後に停止します子。例として

  • ルート= 3
  • root.left = 2
  • root.right = 5
  • 2.left = 1

    a='' draw(3,a) a

予想される出力:

'Commands to draw 3, Commands to draw 2, Commands to draw 5, Commands to draw 1'

+0

私はそれは一例ですが、 '' 2.left Pythonであまり意味がありません知っています。 –

答えて

1

あなたstring argがあります関数のローカル変数です。返す場合を除いて、関数にローカルに代入する必要はありません。 Pythonの文字列は不変なので、渡された文字列を実際に変更することはできません。新しい文字列オブジェクトを作成するためには、渡す文字列を変更するだけで済みます。

文字列をargとして渡すのではなく、再帰呼び出しから戻します。

私はこのコードはあなたが欲しいと思います。私は非常に単純なNodeクラスを作成してテストしました。

class Node: 
    def __init__(self, data): 
     self.data = data 
     self.left = None 
     self.right = None 

def draw(node, depth=0): 
    tab = 4 * ' ' * depth 
    depth += 1 
    string = tab + 'Commands to draw node. ' + node.data +'\n' 
    if node.left is not None: 
     string += tab + 'Commands to draw a left child.\n' 
     string += draw(node.left, depth) 
    if node.right is not None: 
     string += tab + 'Commands to draw a right child.\n' 
     string += draw(node.right, depth) 
    return string 

tree = Node('A') 
tree.left = Node('B') 
tree.right = Node('C') 
tree.left.left = Node('D') 
tree.left.right = Node('E') 

s = draw(tree) 
print(s) 

出力

Commands to draw node. A 
Commands to draw a left child. 
    Commands to draw node. B 
    Commands to draw a left child. 
     Commands to draw node. D 
    Commands to draw a right child. 
     Commands to draw node. E 
Commands to draw a right child. 
    Commands to draw node. C 
+0

私は忘れてました:string + = draw(node.left) 私はちょうどしました:draw(node.left)。 –

1

あなたはそれが目的球の局所的な範囲でのご変更のご滞在をotherwhise返す必要が..

def draw(root,string): 
    string += 'Commands to draw the root' 
    if root.left != None: 
     string += 'Commands to draw a left child' 
     draw(root.left,string) 

    if root.right != None:...#same as for the left child 
    return string 

その後、

>>>a = '' 
>>>a = draw(root,a) 
>>>print(a) 
+0

私はそれを試み、根とその直接の子供たちに終わった。サブツリーは欠落していました。 –

関連する問題