重发代码!垃圾毒熊吃我帖子!
prolog吧
全部回复
仅看楼主
level 13
丁兔 楼主
不知道又是什么敏感*词惹了度凶,可能是wei信,重发一遍 @kun小宝
题目要求:
interleave(Ls,L). Ls是多个列表组成的列表,且各个列表长度相同,如[ [1,2],[3,4] ]。
要求interleave([ [a,b],[c,d] ], [a,c,b,d] ),Ls内不确定有多少个列表。实现interleave的代码。
代码:
interleave(Ls,[]):-allnull(Ls).
interleave(Ls,L):-
get_heads(Ls,Hs),
get_tails(Ls,Ts),
interleave(Ts,Ln),
append(Hs,Ln,L).
get_heads([],[]).
get_heads(Ls, Heads):-
Ls = [L1|Ln],
L1 = [H|T],
get_heads(Ln,Hs),
Heads = [H|Hs].
get_tails([],[]).
get_tails(Ls, Tails):-
Ls = [L1|Ln],
L1 = [H|T],
get_tails(Ln,Ts),
Tails = [T|Ts].
allnull([]).
allnull(Ls):-
Ls=[[]|T],
allnull(T).
append([],X,X).
append([A|X],Y,[A|Z]):- append(X,Y,Z).
2017年09月28日 02点09分 1
level 1
老哥还是强啊 思路很清晰
顺便能解释下allnull的作用吗?感觉没什么用啊
我把它删了程序就出错
改成interleave(Ls,[]):- Ls = [].也错
2017年09月28日 17点09分 2
interleave递归到最后的状态是这样的interleave([ [],[],...[] ], []),第一个参数是由不确定数量的空列表组成的列表。allnull就是为了处理这个参数而写的。或者叫all_elements_are_empty_lists更好理解
2017年09月29日 07点09分
@丁兔 [真棒] 早上我也想明白了 想另外问下 ":"和".."是什么作用
2017年09月29日 08点09分
回复 tmac1💯 :“:”我查到了 是用来拆分表达式的 冒号不知道
2017年09月29日 08点09分
回复 tmac1💯 :[疑问]“:”不就是冒号?
2017年09月29日 08点09分
level 1
interleave(X,[a,b,c,d]).%爆堆栈了[滑稽]
2017年10月05日 12点10分 3
level 1
e([_],[_]).
e([_|T1],[_|T2]):-
e(T1,T2).
interleave([X],X).
interleave([X,Y|T],R):-
append(X,RR,R),
e(X,Y),
interleave([Y|T],RR).
[滑稽]
2017年10月05日 12点10分 4
这个能让[[a,b,c],[d,e,f],[g,h,i]]变成[a,d,g,b,e,h,c,f,i]吗?
2017年10月05日 15点10分
@丁兔 可以啊[滑稽]
2017年10月06日 07点10分
@丁兔 但是这样interleave([[a|T1],[c,d|T2],[e,f]],[A,b|T3]).就暂时做不到了[滑稽]
2017年10月06日 07点10分
@丁兔 值可以求出来,但是终止条件不对,炸堆栈[滑稽]
2017年10月06日 07点10分
level 1
花式判断质数。[滑稽]
e([_,_],[_,_]).
e([_|T1],[_|T2]):-
e(T1,T2).
interleave([X,Y],R):-
append(X,Y,R),
e(X,Y).
interleave([X,Y|T],R):-
append(X,RR,R),
e(X,Y),
interleave([Y|T],RR).
composite(N):-
length(L,N),
interleave(_,L).
?- composite(7).
no
2017年10月05日 13点10分 5
高手,不过题目不是这样理解的
2017年10月05日 15点10分
level 13
丁兔 楼主
改进版代码,解决了interleave(A,[1,2,3,4])和interleave([[a|T1],[c,d|T2],[e,f]],[A,b|T3])会爆栈问题。
% 交叉合并列表
interleave(Ls,L):-
var(Ls) ->
(
matrix_list(Trs,L),
trans(Trs,Ls)
);
(
trans(Ls,Trs),
matrix_list(Trs,L)
).
% 矩阵转置
trans([[X]],[[X]]):-!.
trans([[H|T]],[[H]|MT]):-
trans([T],MT),!.
trans(MA,MB):-
var(MA) ->
trans(MB,MA);
(
matrix(MA,M,N), matrix(MB,N,M),
MA=[R1|M1],
trans(M1,M2),!,
set_heads(R1,M2,MB)
).
% 获取矩阵的行列数
matrix([[H|T]],1,N):-
length([H|T],N),!.
matrix([R|MA],M,N):-
length(R,N),
length([R|MA],M),
MM is M - 1,
matrix(MA,MM,N).
% 子列表加头元素
set_heads([],L,L).
set_heads(R,L1,L2):-
R=[H|T],
L1=[H1|T1],
set_heads(T,T1,T2),
L2=[[H|H1]|T2].
% 矩阵转列表
matrix_list([[H|T]],[H|T]).
matrix_list([R1,R2|T],L):-
append(R1,LL,L),
equlen(R1,R2),
matrix_list([R2|T],LL).
% 同长列表
equlen([_],[_]).
equlen([_|T1],[_|T2]):-
equlen(T1,T2).
% 防爆栈版求列表长
length(L, N) :-length(L, 0, N).
length([], N, N).
length([_|Y], X, N) :-
X \== N,
XX is X + 1,
length(Y, XX, N).
append([],X,X).
append([A|X],Y,[A|Z]):- append(X,Y,Z).
2017年10月07日 11点10分 6
level 9
这个贴学习中……
高手[滑稽]
2017年11月27日 14点11分 7
1