2011-05-23 20 views
-2

我已经写代码逆子列表

minv([],_,_,[]). 
minv(L,N,K,Result):- 
    slist(0,N-1,L,Re1), 
    append(Re1,[],Result1), 
    slist(N-1,K-N+1,L,Re), 
    reverse(Re,Res), 
    append(Result1,Res,Result2), 
    length(L,D), 
    slist(K,D-K,L,Resu), 
    append(Result2,Resu,Result). 


slist(0,0,_,[]):-!. 
slist(0,Length,[E|List],[E|Sublist]):- 
    Length1 is Length-1,!, 
    slist(0,Length1,List,Sublist). 
slist(Offset,Length,[_|List],Sublist):- 
    Offset1 is Offset-1,!, 
    slist(Offset1,Length,List,Sublist). 

但是老师伤心它不是序言风格,因为MINV那么糟糕。请帮助

+2

你的老师是对的。 – Vincent 2011-05-23 05:40:32

回答

2

我花了一段时间才明白,minv意味着我的逆反。 您只需从输入列表中获取元素并将其附加到结果列表的末尾。

inverse([], []). 
inverse([H|T], Result):- 
    inverse(T, TInv), append(TInv, [H], Result). 
1

这不是乔治在答案中提到的简单相反。 minv(列表,开始,结束,结果)将子列表从开始到结束并仅反转该部分。

| ? - minv([1,2,3,4,5,6,7,8,9],2,3,X)。

X = [1,3,2,4,5,6,7,8,9]?

0

让我试试:(我没有测试它在序言)

inverse(L, 1, 1, L). 

inverse([H|L], 1, K, [H|R]):- 
    inverse(L, 1, K-1, LInv), append(LInv, [H], R). 

inverse([H|L], N, K, [H|R]):- 
    inverse(L, N-1, K, R). 
0

inverse(L,Begin,End,Result) :- 
     length(L1,End), 
     Begin_1 is Begin - 1, 
     length(L0,Begin_1), 
     append(L0,L2,L1), 
     append(L1,L3,L), 
     reverse(L2,RL2), 
     append(L0,RL2,L3,Result).