2013-04-25 5 views
7

Ljubomir Perkovic의 Python을 사용한 컴퓨팅 소개 책을 읽고 있는데이 책의 재귀 섹션에있는 예제 중 하나에 문제가 있습니다. 다음 코드는 :Python3의 재귀 함수에서 print() 사용

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 문이 오면 결과가 표시됩니다. 나는 재귀 함수 내부의 print() 기능의 end 인수를 제거 할 경우 (이 수직으로 표시이기는하지만)

>>>pattern(1) 
>>>print() 
0 1 0 

, 내가 올바른 출력을 얻을 :

>>> pattern(1) 
0 
1 
0 

이 나를 생각하게하는 재귀 코드 자체 (나는 책의 웹 사이트에서 제공 한 소스와 정오표가 맞는지 확인했다.) 그러나 end 매개 변수가 포함 된 경우 print 문이 함수가 실행될 때 출력이 인쇄되지 않는 이유는 확실하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.

+0

이 문제는 IDE 특정 될 수있다 :

이 두 프로그램의 차이를 참조하십시오. Ubuntu/gnome-terminal (또는 IPython + emacs)에서 실행되는 Python3을 사용하는 것으로는 보이지 않습니다. – unutbu

답변

7

print 기능은 항상 출력을 플러시하지 않습니다. 당신은 명시 적으로 세척해야합니다 python3.3 print에 당신이 (sys.stdout.flush를 사용하지 따라서 등) 강제 출력을 플러시하는 데 사용할 수있는 새로운 키워드 인수 flush을 가지고

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

참고. 이 코드는보다 유연하고 재사용 할 수

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) 
+3

대화 형 셸에서 플러시하지 않는 것이 이상하게 보입니다. –

+0

@LevLevitsky 만약 당신이'pattern (1); time.sleep (10)' – Bakuriu

+0

그랬어! 감사! – gos1

4

이유는 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