在prolog中,递归是如何工作的
我的目标是取X和Y之间的数字,然后生成Z在prolog中,递归是如何工作的,prolog,Prolog,我的目标是取X和Y之间的数字,然后生成Z num_between(3,6, All) 例如,若X为3,Y为6,则Z是X和Y之间的数字列表(包括X和Y)。类似于num_介于3,6、[3,4,5,6]之间的值应该为true。以下是我目前掌握的情况: num_between(0,0, []). num_between(X,Y, All) :- increase(X, New) , % increase number X++ \+(X = Y) ,
num_between(3,6, All)
例如,若X为3,Y为6,则Z是X和Y之间的数字列表(包括X和Y)。类似于num_介于3,6、[3,4,5,6]之间的值应该为true。以下是我目前掌握的情况:
num_between(0,0, []).
num_between(X,Y, All) :-
increase(X, New) , % increase number X++
\+(X = Y) , % check if X is not equal to Y
num_between(New,Y,[All|X]) . % requestion ???
increase(F,N) :- N is F+1 .
递增/1正在工作并返回所需的数字,但
当递归在/3之间通过num_时,它将不亮起:X为6,然后按照我的意愿失败,
但我无法保存号码或返回号码。全部=[3,4,5,6]
有人能帮忙吗 您必须同时更改基本大小写和递归子句:
num_between(X, X, [X]).
num_between(X, Y, [X|L]):-
X < Y,
increase(X, New),
num_between(New, Y, L).
第一个子句是基本情况,它声明从X到X的数字只是[X]
递归子句指出,小于数字Y的数字X应该在输出列表中,因此头的第三个参数中的[X | L]是,然后它增加了值,我只是用你的helper过程来实现它,然后用第一个参数的新值递归地调用它自己。你的base子句是不正确的:因为你从来没有减少X或Y,除非Y从零开始,而X从非正值开始,否则它们永远不会达到零。base子句应如下所示:
num_between(X, Y, []) :- X > Y.
num_between(X, Y, [X|Tail]) :-
X =< Y,
Next is X + 1,
num_between(Next, Y, Tail).
这可以确保当用户输入无效的向后范围(例如从6到3)时,得到一个空结果
现在转到main子句:您只需检查范围是否有效,获取下一个值,并进行递归调用,如下所示:
num_between(X, Y, []) :- X > Y.
num_between(X, Y, [X|Tail]) :-
X =< Y,
Next is X + 1,
num_between(Next, Y, Tail).
您通过递归调用链传递所有扩展后的结果。这应该是另一种方式-您需要传入一个尾部来收集结果,然后在递归调用结束时将X预先挂起到该尾部。我将沿着以下几行来写:
numbers_between( X , X , [X] ) . % if X and Y have converged, we have the empty list
numbers_between( X , Y , [X|Zs] ) :- % otherwise, add X to the result list
X < Y , % - assuming X is less than Y
X1 is X+1 , % - increment X
numbers_between(X1,Y,Zs) % - recurse down
. %
numbers_between( X , Y , [X|Zs] ) :- % otherwise, add X to the result list
X > Y , % - assuming X > Y
X1 is X-1 , % - decrement X
numbers_between(X1,Y,Zs) % - recurse down
. %
如果Y>X呢?从来没有[]的理由吗?谢谢。这是一个很好的解释,它的工作正是我想要的。