这是一个非常简单的问题,希望它也有一个简单的答案。我正在尝试生成一个最多为N的数字列表。例如,对于N = 3,程序将输出[0,1,2]。
我的问题是我的代码给了我[[0,1,2]]。我需要列表只有一个列表,而不是嵌套在另一个列表中。
这是我的代码:
genNhelp2(N,N,L,L).
genNhelp2(N,C,L,R) :-
C < N,
append(L,C,Res),
C1 is C + 1,
genNhelp2(N,C1,Res,R).
genN(N,R) :-
genNhelp2(N,0,[],R).
我也尝试了这个,结果相同:
genNhelp(N,N,[]).
genNhelp(N,C,[C|R]) :-
C < N,
C1 is C + 1,
genNhelp(N,C1,R).
genN(N,R) :-
genNhelp(N,0,R).
这似乎很容易解决,但我无法弄明白。谢谢!
答案 0 :(得分:2)
你介意将你的签名从genN / 2更改为genN / 3,这样它会更通用和简单吗?这样:
genN(X, X, [X]).
genN(From, To, [From|T]) :-
From1 is From + 1,
genN(From1, To, T).
现在能够做到这样的事情:
>> genN(0, 3, L).
L = [0, 1, 2, 3]
甚至
>> genN(-2, 4, L).
L = [-2, -1, 0, 1, 2, 3, 4]
答案 1 :(得分:0)
你真的不需要助手。怎么样?
genN(0,[]).
genN(N,R) :-
N > 0,
N1 is N-1,
genN(N1,R1),
append(R1,[N1],R).
答案 2 :(得分:0)
这样的事情应该有效:
gen_range(N,Ns) :- % to generate a list of sequential numbers,
gen_range(N,0,[],Ns) % - just invoke the helper, appropriately seeded
. % - that's all there is to it.
gen_range(0,_,Ns,NS). % succeed when the range is complete
gen_range(N,X,Ts,Ns) :- % otherwise...
N > 0 , % - if the range is not yet complete
N1 is N-1 , % - increment X
X1 is X+1 , % - decrement N
gen_range(N1,X1,[X|Ts],Ns) % - and recurse down.
. %