这是我的代码,用于制作倒计时程序,当我输入countdown(5,L).
时应该返回
L = [5,4,3,2,1]
和countdown(5,[5,4,3,2,1])
应该返回true
。
输入countdown(5,L).
返回
错误:是/ 2:输入错误:
[]' expected, found
[5,4]' (" x"必须包含一个字符)
显示我的程序开始创建列表。
%countdown
countdown(1,[1]).
countdown(A,L) :-
concat([],[A],Z),
makeList(Z,A,List),
L is List.
makeList(X,Y,List) :-
N1 is Y-1,
N1 > 0,
concat(X,[N1],Z),
List is Z,
makeList(Z,N1,List).
concat([],Y,Y).
concat([H|X],Y,[H|Z]):-
concat(X,Y,Z).
答案 0 :(得分:1)
为什么这么难?
countdown(1, [1]).
countdown(N, [N|T]) :-
N1 is N-1,
countdown(N1, T).
答案 1 :(得分:0)
对您的代码的一些评论:
countdown/2
,第2条第1行:
concat([],[A],Z)
完全没必要。
在本练习结束时,Z
与[A]
统一。
countdown/2
,第2条第3行:**
正如所指出的,is/2
评估右手术语为
算术表达式并将结果与左侧统一。
这应该是L = List
。
更好的是,只需将上面的行从makeList(Z,A,List)
更改为makeList(Z,A,L)
。
但这太复杂了。如果要采取一般方法,你可以这样做:
count_down(N,L) :- % To count down to 1 from N,
integer(N) , % N must first be integral
N > 0 , % and positive
range(N,1,L). % Then you just need to generate the desired range.
range/3
可以简单地实现:
range( X , Y , [X] ) :- X = Y .
range( X , Y , [X|Xs] ) :- X > Y , X1 is X-1 , range(X1,Y,Xs) .
range( X , Y , [X|Xs] ) :- X < Y , X1 is X+1 , range(X1,Y,Xs) .