Использование print () внутри рекурсивных функций в Python3
я следую за книгой "введение в вычисления с использованием Python" Любомира Перковича, и у меня возникли проблемы с одним из примеров в разделе рекурсии книги. Код выглядит следующим образом:
def pattern(n):
'prints the nth pattern'
if n == 0: # base case
print(0, end=' ')
else: #recursive step: n > 0
pattern(n-1) # print n-1st pattern
print(n, end=' ') # print n
pattern(n-1) # print n-1st pattern
, например, pattern(1)
, выход должен быть 0 1 0
, и он должен отображаться горизонтально. При вызове функции pattern(1)
, однако, ничего не печатает. Но если за этим следует оператор print без аргументов, то результаты отображается.
>>>pattern(1)
>>>print()
0 1 0
если я удалить
2 ответов
на print
функция не всегда очищает выход. Вы должны очистить его явно:
import sys
def pattern(n):
'prints the nth pattern'
if n == 0: # base case
print(0, end=' ')
else: #recursive step: n > 0
pattern(n-1) # print n-1st pattern
print(n, end=' ') # print n
pattern(n-1) # print n-1st pattern
sys.stdout.flush()
обратите внимание, что на python3.3 print
имеет новый аргумент ключевого слова flush
что вы можете использовать, чтобы принудительно очистить выход(и, следовательно, избежать, используя sys.stdout.flush
).
на общем примечании я бы отделил вывод от шаблона, делая, например:
def gen_pattern(n):
if n == 0:
yield 0
else:
for elem in gen_pattern(n-1):
yield elem
yield n
for elem in gen_pattern(n-1):
yield elem
def print_pattern(n):
for elem in gen_pattern(n):
print(elem, end=' ')
sys.stdout.flush()
это делает код более гибким и многоразовым и имеет преимущество вызова flush
только один раз, или вы также можете назвать его один раз каждый x
элементы(на самом деле я считаю print
уже делает это. Он смывается, если пытается написать много символов на экране).
в python3.3 код можно немного упростить:
def gen_pattern(n):
if n == 0:
yield 0
else:
yield from gen_pattern(n-1)
yield n
yield from gen_pattern(n-1)
причина в том, что когда end
используется с некоторым значением, отличным от "\n"
затем функция печати накапливает все значение и печатает вывод только тогда, когда новая строка должна быть напечатана или цикл завершен.
видите разницу в этих двух программах:
In [17]: for x in range(5):
print(x,end=" ")
if x==3:
print(end="\n")
sleep(2)
....:
0 1 2 3 #first this is printed
4 #and then after a while this line is printed
In [18]: for x in range(5):
print(x,end=" ")
if x==3:
print(end="\t")
sleep(2)
....:
0 1 2 3 4 #whole line is printed at once