1
def test(): 
    boo = True 
    enter = int(raw_input("Enter something: ")) 
    if enter > 0: 
     boo = False 
     print "Did it work?!" 
    else: 
     print "Still working..." 
    while boo == True: 
     test() 

test() 

if 코드의 첫 번째 부분이 처음으로 충족되면이 코드가 작동하는 것처럼 보입니다. 일명 -1을 입력하면 함수를 통해 반복됩니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?파이썬에서 부울 문과 if 문의 문제

+2

? 사용자로부터 양의 정수 입력을 얻으시겠습니까? – TheSoundDefense

+0

재귀가 의도 되었습니까? – Don

+1

함수가 루프에서 호출되고 [재귀 적으로] (http://en.wikipedia.org/wiki/Recursion_%28computer_science%29) 것을 알고 계셨습니까? 그건 좀 이상해 보입니다. – skrrgwasme

답변

2

boo로컬입니다. 반복적으로 test()을 호출 할 때마다 해당 재귀 호출은 로컬 변수 boo을 호출하며이를 호출하는 모든 부모 함수와 독립적입니다. 따라서 기능 시작시 True으로 설정됩니다.

통화는 다음과 같습니다 :

  • test()

    , boo = True, enter = 1, 그래서 while boo == True가 true :

    • test(), boo = True, enter = -1, 그래서 while boo == True이 거짓, 복귀 중
이 수준에서
  • 16,, boo == True 여전히 사실, 그래서 우리는 다시 test()를 호출합니다. 그래서 while boo == True 복귀가 거짓

    • test(), boo = True = -1 enter,

등 광고 nauseum.

def test(): 
    boo = True 
    enter = int(raw_input("Enter something: ")) 
    if enter > 0: 
     boo = False 
     print "Did it work?!" 
    else: 
     print "Still working..." 
    while boo: 
     boo = test() 
    return boo 

지금 test() 반환, 당신은 호출하는 함수 False-에 boo 을 설정할 때 :

당신은 반환boo로합니다.

== True은 중복이며 while booboo을 자체 테스트합니다.

사용자 입력에 재귀를 사용하는 것은 실제로 바람직하지 않습니다.

while True: 
    enter = int(raw_input("Enter something: ")) 
    if enter < 0: 
     print "Did it work?!" 
     break 
    print "Still working..." 
+0

(+1)하지만 재귀가 완전히 불필요하다는 것을 보여 주면 좋겠지 만 논리를 모호하게합니다. – NPE

+0

@NPE : 더 나은 옵션을 추가 하느라 바빴습니다. OP가 어디서 잘못 나왔는지 설명하고 싶었습니다. –

+0

이것은 좋은 설명입니다. 감사. 나는 파이썬에 익숙하지 않고 재귀에 대해서 확실히 읽을 것이다. 나는 모든 것을 잠시 루프에 넣는 것이 많은 도움이 될 것이라고 생각합니다. – Joe

2

재귀 함수와 매우 위험한 게임을 잠재적으로 무한 while 루프입니다 결합 : 그냥 while 루프를 사용합니다. test()의 후속 통화가있을 때 즉시 통화를 마치더라도 퇴장해도 원래 전화 test()은 계속 반복됩니다. boo은 이후 함수에서 변경 되었기 때문에 원래 함수 호출에서 변경되지 않습니다.

귀하의 코드는이 방법으로 해결 될 수

:

def test(): 
    boo = True 
    enter = int(raw_input("Enter something: ")) 
    if enter > 0: 
     boo = False 
     print "Did it work?!" 
    else: 
     print "Still working..." 
    if boo == True: 
     test() 

을하지만 더 나은이 방법이 될 것입니다 :

정확히 뭘하려고 무엇
def test(): 
    enter = int(raw_input("Enter something: ")) 
    while enter <= 0: 
     print "Still working..." 
     enter = int(raw_input("Enter something: ")) 
    print "Did it work?!"