Basit bir örnek olarak, L
numaralı bir listenin olduğunu varsayalım ve belirli bir sayıdan daha büyük olan ilk öğeyi bulmak istiyorum X
. Böyle Liste tanımlama ile yapabilirsiniz:Erlang: Bir listedeki ilk öğe (öğelerin geri kalanını değerlendirmeye almadan)
([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
Ama liste çok uzun olabilir ve ilk maçı erkenden olabilir çünkü bu, potansiyel olarak çok verimsiz görünmektedir. Yani merak ediyorum ya a) İlk maçın bulunmasından sonra listedeki elemanların geri kalanını değerlendirmeyecek olan bunu yapmanın etkili bir yolu var mı? veya b) Bu, derlendiğinde, Erlang, karşılaştırmaların geri kalanını her halükarda optimize eder mi?
Bu ben C aradığım şey başarmak şekli şöyledir:
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 */
}
Güzel. Bu benim çözümümden daha özlü. Aslında 'başarısızlığın' ilk başarısız maçtan sonra değerlendirmeyi durdurduğunu doğrulamak için biraz araştırma yapmak zorunda kaldım. Bu durumu, bir işlevi (mantığı tersine çevirmek zorunda kalmadan) bir işlev olarak belirtebilmenizi sağlayan bir işlevle tamamladım: https://gist.github.com/3807110 – dantswain