Recursion 尾部递归和反转列表的问题?

Recursion 尾部递归和反转列表的问题?,recursion,prolog,logic,tail,Recursion,Prolog,Logic,Tail,您好,我有一个电话,如以下数字列表(436,L) 我怎样才能反转列表,并使其尾部递归 list_of_digits(0,[]). list_of_digits(M, [Z|Zx]) :- M > 0 , MM is floor(M / 10), Z is M mod 10, list_of_digits(MM,Zx). 谁能帮帮我吗 我想把我的号码,在这里是43

您好,我有一个电话,如以下数字列表(436,L)

我怎样才能反转列表,并使其尾部递归

list_of_digits(0,[]).
list_of_digits(M, [Z|Zx]) :- M > 0 , 
                  MM is floor(M / 10), 
                  Z is M mod 10,        
                  list_of_digits(MM,Zx).
谁能帮帮我吗

我想把我的号码,在这里是436,转换成 类似于[4,3,6]的列表

I call  ?-  list_of_digits(436,L)
and get 
    L = [6,3,4] ;
    false.
back.
使用蓄能器:

list_of_digits(X,L) :- lod_acc(X, [], L).
lod_acc(0,R,R).
lod_acc(M,Acc,R) :-
    M > 0, 
    MM is floor(M / 10), 
    Z is M mod 10,        
    lod_acc(MM,[Z|Acc],R).

我会这样做,处理负数和零本身(特殊情况):

%
%外部/公共API谓词。
%
%这将处理零的特殊情况,零有一个数字。
%所有其他情况都由内部工作者谓词处理。
%
(X,Ds)中的数字:int(X),X>0,(X,[],Ds)中的数字。
(X,Ds)中的数字:int(X),X<0,Y是abs(X),数字(Y,[],Ds)中的数字。
(0,[0])中的数字_。
%
%操作谓词的内部/私有内脏
%
(0,Ds,Ds)中的数字。\u.%当我们达到零,我们就完了。
(X,Ts,Ds)中的数字\u:-%否则。。。
T为X mod 10%,通过模运算得到低阶数字
X1为X//10%,通过整数除法获取高阶数字
(X1[T|Ts],Ds)%[tail-]中的数字u向下递归。
.

@Boris我想把数字436转换成一个列表,在我的例子中,我的列表顺序错误,不是尾部递归的,你能解释一下,我怎样才能使它尾部递归吗recursive@CapelliC哦,我只试过。很好,我怎样才能撤销我的列表???@Boris哦,对不起,我的错,在我的例子中,我得到的是[6,3,4],而不是[4,3,6],我知道如何撤销列表,但我不能合并它。有什么建议吗??我编辑了,我已经解决了,谢谢。
%
% the external/public API predicate.
%
% this handles the special case of zero, which has 1 digit.
% all other cases are handled by the internal worker predicate.
%
digits_in( X , Ds  ) :- int(X) , X > 0 ,               digits_in(X,[],Ds).
digits_in( X , Ds  ) :- int(X) , X < 0 , Y is abs(X) , digits_in(Y,[],Ds).
digits_in( 0 , [0] ) .

%
% the internal/private guts-of-the-operation predicate
%
digits_in( 0 , Ds , Ds ).        % when we hit zero, we're done.
digits_in( X , Ts , Ds ) :-      % otherwise...
  T  is X mod 10 ,               % get the lower order digit via modulus arithmetic
  X1 is X //  10 ,               % get the high order digits via integer division
  digits_in( X1 , [T|Ts] , Ds )  % [tail-]recurse down.
  .