以递归方式构建列表Prolog

时间:2014-12-08 16:07:42

标签: list recursion prolog

这是一个非常简单的问题,希望它也有一个简单的答案。我正在尝试生成一个最多为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).

这似乎很容易解决,但我无法弄明白。谢谢!

3 个答案:

答案 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.
  .                          %