2016-10-27 6 views
1

私は木のサブカテゴリを書くために再帰関数に取り組んでいます。私はグローバル変数を使いたくないのですが、recurseメソッドでファイルに書き込む最良の方法は何ですか?Python - グローバル変数なしで再帰的に書く方法

def recurse(i): 
    Xmlfile = file("index.html", "w") 
    if i < 5: 
     Xmlfile.write(str(i)) 
     recurse(i+1) 
    return(None) 

def main(): 
    Xmlfile = file("index.html", "w") 
    Xmlfile.write("I") 
    recurse(3) 
    Xmlfile.write("O") 

予想される出力は、の線に沿って何かする必要があります:I 3 4 5 Oが、私は私だけO.

+1

再帰関数のパラメータとしてファイルハンドルを渡します。 – Ambrish

+0

「n」はどこから来ますか? – LittleQ

+0

@LittleQ素敵な目、私はそれを私のために変更しました – Juanvulcano

答えて

7

が引数として渡す取得しています。あなたがやっているやり方は、すべての反復でファイルを開き直して切り詰めます。私はopen()推奨とfile()を交換してきたし、ファイルを確実にするためにコンテキストマネージャを追加した

def recurse(f, i): 
    if i < 5: 
     f.write(str(i)) 
     recurse(f, i+1) 

def main(): 
    with open("index.html", "w") as xmlfile: 
     xmlfile.write("I") 
     recurse(xmlfile, 3) 
     xmlfile.write("O") 

注意が閉じます。

+0

['file'](https://docs.python.org/2/library/functions.html#file)の使用に関するドキュメントへのリンクを追加するだけで、 : "ファイルを開くときは、このコンストラクタを直接呼び出すのではなく、[' open() '](https://docs.python.org/2/library/functions.html#open)を使用することをお勧めします。 – Matthias

1

ファイルを関数に渡してみてください。関数でファイルを作成すると、関数を呼び出すたびに新しいファイルが作成されます。あなたはこのようなものに変更した場合、それは動作します:

n=6 

def recurse(i, Xmlfile): 
    if i < n: 
     Xmlfile.write(str(i)) 
     recurse(i+1, Xmlfile) 
    return(None) 

def main(): 
    Xmlfile = file("index.html", "w") 
    Xmlfile.write("I") 
    recurse(3, Xmlfile) 
    Xmlfile.write("O") 
+0

この新しい情報にはどのようなものがありますか? – TigerhawkT3

+0

私はあなたの答えを見ました。しかし、ええ、新しい情報はありません。 – Manali

0

TigerhawkT3Manaliの両方で述べたように、あなたが関数にXmlfileを渡す必要があります。

それはもう少し変更

def recurse(i, Xmlfile, deepness = 0, times = -1): 
    if times == -1: 
     times = i 
    if deepness < times: 
     Xmlfile.write(str(i)) 
     recurse(i+1, Xmlfile, deepness+1, times) 

def main(): 
    Xmlfile = file("index.html", "w") 
    Xmlfile.write("I") 
    recurse(3, Xmlfile) 
    Xmlfile.write("O") 

i < 5のように)繰り返しの静的数の必要性を除去するために一緒に両方deepnesstimes仕事を。今度は、の再帰(n、Xmlfile)のように、何度でも何度も繰り返すことができます。

関連する問題