2016-10-27 4 views
1

Я работаю над рекурсивной функцией для записи подкатегорий дерева. Я не хочу использовать глобальный var, что лучший способ записать в файл метод recurse?Python - Как написать рекурсивно без глобального var

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, но я только получаю я О.

+1

Передача дескриптора файла в качестве параметра функции рекурсии. – Ambrish

+0

где 'n' происходит? – LittleQ

+0

@LittleQ Хороший глаз, я изменил его для I – Juanvulcano

ответ

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(), и добавил менеджер контекста, чтобы обеспечить файл закрывается.

+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

Как заявил как TigerhawkT3 и Manali, вы должны пройти 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 работают вместе, чтобы устранить необходимость статического числа повторений (как в i < 5). Теперь вы можете реорганизовать столько раз, сколько хотите, как в recurse (n, Xmlfile).

Смежные вопросы