簡體   English   中英

遞歸程序中的無限循環

[英]Infinite loop in recursive program

我在不應在此處的遞歸程序中遇到無限循環。 我的程序用於繪制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”。

您沒有基本條件:即使n已經為0,也總是返回n-1的遞歸調用。您應該在if塊內添加一個空白return ,以便在n = 0時返回並終止遞歸。

另外,由於遞歸實際上不返回任何內容,因此您可以考慮完全刪除return語句,而僅在else塊內進行遞歸Sierpienski()調用。

在更正后的版本中,您僅繪制中心三角形。 嘗試在每個深度層繪制每個三角形的每個邊緣,並在到達n==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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM