【问题标题】:Infinite loop in recursive program递归程序中的无限循环
【发布时间】:2015-01-04 20:36:18
【问题描述】:

我在递归程序中有一个不应该出现在这里的无限循环。我的程序用于绘制谢尔宾斯基三角形 (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”应该结束程序。

【问题讨论】:

  • 你调试了吗?就像试图弄清楚为什么它是错误的一样。如果这样做,您可能会注意到无限循环是有意义的。

标签: python recursion fractals


【解决方案1】:

你没有基本条件:你总是返回一个带有 n-1 的递归调用,即使 n 已经是 0。你应该在 if 块内添加一个空白 return,如果 n = 0,它会返回并终止递归。

或者,由于递归实际上不返回任何内容,您可以考虑完全删除 return 语句,并在 else 块内进行递归 Sierpienski() 调用。

【讨论】:

  • 谢谢你,先生,但现在它没有画出它应该画的东西。
  • 好吧@Paul,这不是一个很有帮助的评论。我建议您首先尝试弄清楚,然后 - 如果这不起作用 - 回来提出一个详细的问题。我相信您最初的问题已得到解答:递归函数应始终达到终止条件。
【解决方案2】:

在您的更正版本中,您只绘制了中心三角形。尝试在每个深度层绘制每个三角形的每条边,并在到达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

【讨论】:

  • 感谢您的帮助!
  • 我刚刚有了一个想法:你的线条画应该真的只在最低深度——看我的编辑。
猜你喜欢
  • 2014-10-13
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2020-02-08
  • 1970-01-01
相关资源
最近更新 更多