Recursion Prolog中计算koch曲线坐标的递归
我必须在Prolog中计算koch曲线的坐标,并且已经得到了一些很好的结果 帮助,使您更容易理解如何将问题分解为更小的问题。 我试着这么做,但没有达到目的。我必须承认,我真的在和递归争吵,不要对我做错的事情耿耿于怀。 我必须编程一条N级的科赫曲线,它应该从(Sx,Sy)开始,到(Ex,Ey)结束 我得到的建议是以以下方式实施:Recursion Prolog中计算koch曲线坐标的递归,recursion,prolog,Recursion,Prolog,我必须在Prolog中计算koch曲线的坐标,并且已经得到了一些很好的结果 帮助,使您更容易理解如何将问题分解为更小的问题。 我试着这么做,但没有达到目的。我必须承认,我真的在和递归争吵,不要对我做错的事情耿耿于怀。 我必须编程一条N级的科赫曲线,它应该从(Sx,Sy)开始,到(Ex,Ey)结束 我得到的建议是以以下方式实施: generatelines(N, S, E, Segments) :- segments(S, E, InitialSegments), iterate_level(N,
generatelines(N, S, E, Segments) :-
segments(S, E, InitialSegments),
iterate_level(N, InitialSegments, Segments).
我开始这样做:
segments(Ls1,Ls):-segments((Sx,Sy),(Ex,Ey),Ls).
segments((Sx,Sy),(Ex,Ey),Ls):-
X2 is Sx+(Ex-Sx)/3,
Y2 is Sy+(Ey-Sy)/3,
R1 is sqrt((X2-Sx)*(X2-Sx)+(Y2-Ey)*(Y2-Ey)),
Phi1 is atan((Y2-Sy)/(X2-Sx)),
X3 is X2 +R1*cos((Phi1-240)*pi/180),
Y3 is Y2 +R1*sin((Phi1+240)*pi/180),
X4 is X2+(X2-Sx),
Y4 is Y2+(Y2-Sy),
Ls=[
[(Sx,Sy),(X2,Y2)],
[(X2,Y2),(X3,Y3)],
[(X3,Y3),(X4,Y4)],
[(X4,Y4),(Ex,Ey)]
],
next_level_segments(Ls).
next_level_segments(Ls):-next_level_segments(Ls,List).
next_level_segments([[(Sx,Sy),(Ex,Ey)]|E],Ls):-
X2 is Sx+(Ex-Sx)/3,
Y2 is Sy+(Ey-Sy)/3,
R1 is sqrt((X2-Sx)*(X2-Sx)+(Y2-Ey)*(Y2-Ey)),
Phi1 is atan((Y2-Sy)/(X2-Sx)),
X3 is X2 +R1*cos((Phi1-240)*pi/180),
Y3 is Y2 +R1*sin((Phi1+240)*pi/180),
X4 is X2+(X2-Sx),
Y4 is Y2+(Y2-Sy),
append(Cs,[
[(Sx,Sy),(X2,Y2)],
[(X2,Y2),(X3,Y3)],
[(X3,Y3),(X4,Y4)],
[(X4,Y4),(Ex,Ey)],
Ls ],
next_level_segments(E,Cs).
next_level_segments([],_):-!.
append([],Ls,Ls).
append([X|As],Bs,[X|Cs]):- append(As,Bs,Cs).
当我试图计算段((60,0),(-60,0),X))时,没有
下一级\u段
我得到了正确的四个坐标
起点(60,0)和(-60,0):
有了这对,我想使用辅助谓词下一级\u段
在例如起点(60,0)
和终点(20,0)
之间生成下4个坐标。
当我看到这些痕迹时,我似乎(希望)并没有错
实现,但我无法获得接下来的16个新坐标和
我想问题在于我做递归的方式
也许有人会给我一些建议我做错了什么。
谢谢我对您的问题域了解不多,但我肯定看到您的代码中有一个问题:
next_level_segments(Ls) :- next_level_segments(Ls,List).
这里可能会出现一个单例变量“警告”(每个单例变量警告都应被视为Prolog中严重错误的指示)。因此,当Prolog到达这一行时,您将继续计算段。让我删除一些中间的行以突出问题:
segments((Sx,Sy),(Ex,Ey),Ls):-
Ls=[...],
next_level_segments(Ls).
因此,在这一点上,Prolog要证明段/3
,它所要做的就是看看下一级段(Ls)
是否成功。因为next\u level\u segments/1
基本上放弃了列表的绑定(您可以用\u
替换),所以这里不会发生任何事情来将该信息传播到任何地方。这可能是你问题的症结所在。你需要得到结果,并用它做点什么。嗨!谢谢你的回答!我听从了你的建议,但据我所知,不幸的是它没有改变。@claire请编辑你的问题并附加你修改过的代码,这样我就可以看一看它了!我会再试一次,我想我必须重新考虑我的实现。但是谢谢你的时间!!在回答你的问题时,我建议将其分解为不同的谓词。但我注意到,您应该使用“几个不同的谓词,每个谓词都有自己的职责”。你没有这样做。只有一个谓词应该包含所有的数值计算;只有一个(其他)谓词应将这些计算应用于成对的点;只有一个(其他)谓词应该在多个级别上迭代此计算。哦:-(好的,我再次尝试。根据你的建议,这是一次尝试,我想我不是最好的…没关系…我再试一次。谢谢你的回答。
segments((Sx,Sy),(Ex,Ey),Ls):-
Ls=[...],
next_level_segments(Ls).