Python - 如何在没有全局变量的情况下递归写入

时间:2016-10-27 06:13:39

标签: python recursion

我正在编写一个递归函数来编写树的子类别。我不想使用全局var,在recurse方法上写入文件的最佳方法是什么?

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,但我只是得到了我。

3 个答案:

答案 0 :(得分:7)

将其作为参数传递。您执行此操作的方式将在每次迭代时重新打开并截断文件。

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

请注意,我已使用推荐的file()替换了open(),并添加了上下文管理器以确保文件已关闭。

答案 1 :(得分: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")

答案 2 :(得分:0)

正如TigerhawkT3Manali所述,您应该将<script src="https://www.gstatic.com/firebasejs/3.5.1/firebase.js"> </script> firebase.initializeApp(config); const messaging = firebase.messaging(); messaging.onMessage(function(payload){ console.log('onMessage',payload); }); 传递给该函数。

稍微更改一下:

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") deepness合作消除了静态重复次数的需要(如times中所述)。现在,您可以按照递归( n ,Xmlfile)进行多次递归。