2015-01-04 4 views
0

여기에 있어서는 안되는 재귀 프로그램에서 무한 루프가 발생합니다. 내 프로그램은 Sierpinski 삼각형 (http://en.wikipedia.org/wiki/Sierpinski_triangle)을 그려야합니다. 여기 내 코드 :재귀 프로그램의 무한 루프

from Python32_Lja import* 

init_window("Triangle de Sierpienski",600,600) 
current_color(0,0,0) 

A=[100,475]#A=[x1,y1] 
B=[500,475]#B=[x2,y2] 
C=[300,125]#C=[x3,y3] 

def Sierpienski(A,B,C,n): 

    if n==0:#On trace le triangle 

     line(A[0],A[1],B[0],B[1])#AB 
     line(B[0],B[1],C[0],C[1])#BC 
     line(C[0],C[1],A[0],A[1])#CA 

    else: 

     MAB=[int((A[0]+B[0])/2),int((A[1]+B[1])/2)]#Milieu de AB 
     MBC=[int((B[0]+C[0])/2),int((B[1]+C[1])/2)]#Milieu de BC 
     MCA=[int((C[0]+A[0])/2),int((C[1]+A[1])/2)]#Milieu de CA 

     line(MAB[0],MAB[1],MBC[0],MBC[1]) 
     line(MBC[0],MBC[1],MCA[0],MCA[1]) 
     line(MCA[0],MCA[1],MAB[0],MAB[1]) 

     A=MAB 
     B=MBC 
     C=MCA 

    return(Sierpienski(A,B,C,n-1)) 

n=int(input("Entrez le nombre de profondeur : "))   
Sierpienski(A,B,C,n) 

main_loop() 

일부 조건이 있으므로 숙제가 있습니다. 알고리즘은 재귀 적이어야하며 Python32_Lja 라이브러리 (Tkinter를 단순화)를 사용해야합니다. 함수가 "n-1"을 반환하기 때문에 무한 루프가 발생하는 이유는 모르겠다.

+0

당신이 그것을 디버깅 적이 : 당신이 n==0에 도달하면 재귀에서 각각의 깊이 계층에서 각 삼각형의 각 가장자리를 그리기하고, 탈출 시도? 에서와 같이 그것이 틀린 이유를 알아 내려고 노력했습니다. 당신이한다면 무한 루프가 의미가 있음을 알 수 있습니다. – keyser

답변

0

수정 된 버전에서는 중심 삼각형 만 그립니다.

def Sierpienski(A,B,C,n): 

    if n==0:#On trace le triangle 
     line(A[0],A[1],B[0],B[1])#AB 
     line(B[0],B[1],C[0],C[1])#BC 
     line(C[0],C[1],A[0],A[1])#CA 
     return 


    MAB=[int((A[0]+B[0])/2),int((A[1]+B[1])/2)]#Milieu de AB 
    MBC=[int((B[0]+C[0])/2),int((B[1]+C[1])/2)]#Milieu de BC 
    MCA=[int((C[0]+A[0])/2),int((C[1]+A[1])/2)]#Milieu de CA 

    Sierpienski(A, MAB, MCA, n-1) 
    Sierpienski(MAB, MBC, B, n-1) 
    Sierpienski(C, MBC, MCA, n-1) 


    return 
+0

도움을 주셔서 감사합니다! –

+0

저는 방금 생각 했었습니다. 라인 드로잉은 실제로 가장 낮은 깊이에 있어야합니다. 제 편집을 참조하십시오. – xnx

3

당신은 기본 조건이없는 : 당신이 항상 N-1로 재귀 호출을 반환, n은 그것을 반환하고 종료하도록 당신의 경우 블록 내부에 빈 return를 추가해야 이미 0 인 경우에도 n = 0의 재귀.

또는 재귀가 실제로 아무 것도 반환하지 않기 때문에 return 문을 모두 제거하고 재귀 적으로 Sierpienski()을 else 블록 내에서 호출하는 방법을 고려해 볼 수 있습니다.

+0

선생님, 고마워합니다.하지만 지금은 그려야 할 것을 그려 내지 않습니다. –

+0

잘 @Paul, 그건별로 도움이되지 않는 의견입니다. 먼저 시도해 보시고 문제가 해결되지 않으면 다시 질문 해주십시오. 귀하의 초기 질문에 대한 답을 얻었습니다 : 재귀 함수는 항상 종결 조건에 부합해야합니다. –