0
Dies ist ein Programm, das eine Liste von Koordinaten erhält: [e (1,2,3), e (4,5,6)]. Machen Sie die Dynamik, teilen und erobern, trennt die Liste in zwei Hälften
und halb rekursiv, Wenn Sie eine haben, transformiert die Koordinaten in einem Tupel von Werten. Das Problem ist, dass es in einer Endlosschleife ist.Prolog Endlosschleife unbekannt
resuelve([X],D):-tuples([X],D).
resuelve(Xs,D):-
length(Xs,L), %length of the list
divideIzq(Xs,L,Xa), %divide the left half
divideDer(Xs,L,Xb), %divide the rigth half
resuelve(Xa,D1), %left recursively
resuelve(Xb,D2), %rigth recursively
append_(D1,D2,D). %concatenate tuples result
%function that transforms the coordinates
tuples([e(X,Y,Z)],D) :- D = [c(X,Z),c(Y,0)].
divideIzq(Xs,L1,D):-
L is div(L1, 2),
take(L,Xs,D).
divideDer(Xs,L1,D):-
L is div(L1, 2),
drop(L,Xs,D).
drop(0,LastElements,LastElements) :- !.
drop(N,[_|Tail],LastElements) :-
N > 0,
N1 is N - 1,
drop(N1,Tail,LastElements).
take(0, _, []) :- !.
take(N, [H|TA], [H|TB]) :-
N > 0,
N2 is N - 1,
take(N2, TA, TB).
append_([], Cs, Cs).
append_([A|As],Bs,[A|Cs]):-
append_(As, Bs, Cs).
Beispiel:
% resuelve([e(3,6,5),e(4,9,3),e(8,11,2),e(10,12,4)], D).
% D = [c(3, 5), c(6, 0), c(4, 3), c(9, 0), c(8, 2), c(11, 0), c(10, 4), c(12, 0)]
Dank
Hier passiert viel, was nicht sichtbar ist ('dividIzq/3'?' DivideDer/3'? 'ResuelveSkyline/2'?). Haben Sie versucht, eine "Trace" zu machen, um zu sehen, wie es sich wiederholt? – lurker
[MCVE] (http://stackoverflow.com/help/mcve), bitte. – false
Wo ist die Rekursion? – false