2016-03-30 2 views
2

Wenn ich eine Liste [1,2,3,4,5] habe, wie kann ich aufeinanderfolgende Paare bekommen und eine Operation an ihnen durchführen? Zum Beispiel möchte ich (1,2) bekommen und DoSomething auf ihnen durchführen. In der nächsten Iteration möchte ich (2,3) bekommen und so weiter. Das ist, was ich habe, so weit:Prolog Liste aufeinanderfolgende Paare

listpairs([H1,H2|T]):-doSomething(H1,H2), listpairs([H2,H3|T]). 

Ich kann die erste Iteration tun, aber ich bin fest, wenn H2 und H3 zu vergleichen.

Antwort

2

Erstens, wenn Sie [1,2,3,4,5] haben, dann [H1,H2|T] Sets H1 = 1, H2 = 2, T = [3,4,5]. H1 und H2 sind die zwei Zahlen, an denen Sie arbeiten möchten. [H2|T] = [2,3,4,5] erstellt die Liste, für die Sie rechnen können. (. Es beginnt mit 2,3 immerhin so Rekursion auf es Sie die beiden nächsten Zahlen geben Sie wollen)

So sollte Ihr rekursive Fall sein:

listpairs([H1,H2|T]) :- doSomething(H1,H2), listpairs([H2|T]). 

Ie: H1 und H2 nehmen out , mach etwas mit ihnen, dann setze H2 zurück und rekrutiere.

Zweitens müssen Sie einen Basisfall für nur ein Element links mit:

listpairs([H]). 

Wenn Sie diesen Schritt auslassen, werden Sie nie einen Basisfall erreichen, wenn die Liste zum Beispiel 5 Elemente, da wir immer 1 zurückstellen. (Das heißt die Liste, die Sie auf Rekursion wird nie leer sein.)

+0

danke! Ich kann nicht glauben, dass es das war. –

0

anstelle einer expliziten ‚Schleife‘, können Sie diesen idiomatischen Ansatz verwenden:

forall(append(_,[X,Y|_],List), doSomething(X,Y)).