簡體   English   中英

遞歸地建立列表

[英]Building a List Recursively 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).

這似乎很容易解決,但我無法弄清楚。 謝謝!

您介意將您的簽名從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]

您真的不需要幫助者。 這個怎么樣?

genN(0,[]).
genN(N,R) :- 
   N > 0,
   N1 is N-1,
   genN(N1,R1),
   append(R1,[N1],R).

這樣的事情應該起作用:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM