'deki bir satıra kadar listeden bir öğe almanın işlevsel yolu Yöntemin amacı, bir sınır ulaşılana kadar öğeleri bir listede almaktır.Scala
örn.
Ben 2 farklı uygulamaları
def take(l: List[Int], limit: Int): List[Int] = {
var sum = 0
l.takeWhile { e =>
sum += e
sum <= limit
}
}
O basittir ile geldim, ama bir değişken devlet kullanılır.
def take(l: List[Int], limit: Int): List[Int] = {
val summed = l.toStream.scanLeft(0) { case (e, sum) => sum + e }
l.take(summed.indexWhere(_ > limit) - 1)
}
Daha temiz görünüyor, ancak bir akış gerektiğinden daha fazla verim ve daha az bellek etkin.
Daha iyi bir yolu var mı?
def take(l: List[Int], limit: Int): List[Int] =
l.fold((List.empty[Int], 0)) { case ((res, acc), next) =>
if (acc + next > limit)
(res, limit)
else
(next :: res, next + acc)
}
standart listeleri tembel değildir ve ne kat olduğu için, bu her zaman listenin tamamını üzerinden geçer:
İkinci yönteminizle ilgili olarak: küçük bir yazım hatası var, L6'da 'take0' var.Ve liste ters sırada döndürülür. Scala standart lib, wdyt bir kat eksik değil mi? –