【问题标题】:Reverse every second list of lists in Prolog反转Prolog中的每一秒列表列表
【发布时间】:2019-12-16 08:31:51
【问题描述】:

我有一个包含列表的列表,我想反转其中的每个第二个列表。我尝试了一些方法,但是如果列表中有奇数个元素,则最后一个列表元素将丢失……因此,最好的解决方案是将奇数列表放在首位,将偶数列表放在第二位,直到每隔一个列表反转。

我不能使用任何库。我需要递归地执行或拆分它们并再次附加它们。到目前为止,我所做的最好的事情是只反转第一个偶数列表并将第一个奇数和偶数列表附加到一个新列表中。

我尝试过这样做:

reverselist(List, [List]).
reverselist([X,Y|Rest], [SnakeList|Rest2]):-
    append(X, [], Odd),
    reverse(Y, EvenList),
    append(Odd, EvenList, SnakeList),
    reverselist(Rest, Rest2).

还有这个:

 reverselist(List1, List2).
 reverselist([H|Ts], [Odd|R]):-
    not(0 is H mod 2),
    append(H, [], Odd),
    reverselist(Ts, R).
 reverselist([H|Ts], [Even|R]):-
    0 is H mod 2,
    reverse(H, Even),
    reverselist(Ts, R).

示例查询:

?- reverselist([[a,b,c],[d,a,b],[c,d,o],[b,c,d],[e,e,d]], List).

我希望结果是:

List = [ [a,b,c],[b,a,d],[c,d,o],[d,c,b],[e,e,d] ].

【问题讨论】:

    标签: list recursion prolog reverse


    【解决方案1】:

    你也可以写相互递归:

    reverselist([],[]).
    reverselist([H|T],[H|T1]):-reverselist2(T,T1).
    
    reverselist2([],[]).
    reverselist2([H|T],[H1|T1]):-reverse(H,H1), reverselist(T,T1).
    

    【讨论】:

      【解决方案2】:

      您的第一个变体非常接近。

      代替你的

      reverselist(List, [List]).
      reverselist([X,Y|Rest], [SnakeList|Rest2]):-
        append(X, [], Odd),
        reverse(Y, EvenList),
        append(Odd, EvenList, SnakeList),
        reverselist(Rest, Rest2).
      

      调整一下

      reverselist([],   []).               % additional clause
      reverselist([List], [List]).
      reverselist([X,Y|Rest], [X,EvenList|Rest2]):-
        reverse(     Y,          EvenList),
        reverselist(   Rest,              Rest2).
      

      所有三个子句都是互斥的,并且它们一起是详尽的,即它们涵盖了所有可能性。

      我相信这个定义是最直接和最接近您的问题的代表。在 Prolog 中,制定问题意味着有解决方案。

      【讨论】:

      • “最直接”,不。奇数元素被指定为ListX 两次。
      【解决方案3】:

      我们需要创建另一个带有一个参数的谓词来跟踪奇数或偶数位置:

      reverselist(InList,OutList):- reverselist(InList,OutList, 0).
      
      reverselist([],[],_). %base case
      %case of even position
      reverselist([H|T],[H|T1], 0):- reverselist(T,T1,1).
      %case of odd position
      reverselist([H|T],[H1|T1], 1):- reverse(H1,H), reverselist(T,T1,0).
      

      【讨论】:

      • 真的真的非常感谢你!我尝试做类似循环将数字加 1 并使用 mods 来找出哪个列表是奇数和偶数的事情,但我失败了!
      猜你喜欢
      • 2013-10-28
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-01-12
      相关资源
      最近更新 更多