Angenommen, ich habe eine Liste von Zahlen L
und möchte das erste Element finden, das größer als eine bestimmte Zahl ist X
. Ich konnte dies mit Listenkomprehensionen wie folgt aus:Erlang: Erstes Element in einer Liste, die eine Bedingung erfüllt (ohne den Rest der Elemente zu bewerten)
([email protected])24> L = [1, 2, 3, 4, 5, 6].
[1,2,3,4,5,6]
([email protected])25> X = 2.5.
2.5
([email protected])26> [First | _] = [E || E <- L, E > X].
[3,4,5,6]
([email protected])27> First.
3
Dies scheint aber potenziell sehr ineffizient, da die Liste sehr lang sein könnte, und das erste Spiel früh sein könnte. Also frage ich mich, ob entweder a) Gibt es eine effiziente Möglichkeit, dies zu tun, die den Rest der Elemente in der Liste nicht bewerten wird, nachdem das erste Spiel gefunden wurde? oder b) Wenn das kompiliert wird, optimiert Erlang den Rest der Vergleiche sowieso weg?
Dies ist, wie ich das erreichen, was für in C Ich suche nach:
int first_match(int* list, int length_of_list, float x){
unsigned int i;
for(i = 0; i < length_of_list, i++){
if(x > list[i]){ return list[i]; } /* immediate return */
}
return 0.0; /* default value */
}
Schön. Dies ist prägnanter als meine Lösung. Ich musste ein wenig nachsehen, ob 'dropwhile' tatsächlich nach dem ersten fehlgeschlagenen Spiel aufhört zu bewerten. Ich habe es in eine Funktion eingepackt, mit der Sie die Bedingung als Funktion angeben können (ohne die Logik zu invertieren): https://gist.github.com/3807110 – dantswain