我的任務是使用折疊(函式式編程)撰寫一個函式來計算串列中滿足謂詞的元素數量。我得到了函式簽名fun <A> count(list<A>, predicate: (A) -> Boolean): Int。折疊不僅要用作迭代,還要生成回傳值。所以我試著這樣做:
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) {
acc, a ->
if (predicate(a)) {
return acc 1
}
return acc
}
}
我寫了一個 println 來檢查它是否有效:
println(count3(listOf (1, -2, 3, 10, -5, 8, 12), { it > 0 && it < 10 }))
但是,我在控制臺上得到的結果是 1 而不是 3,我不知道故障出在哪里。那么,有沒有人知道我的錯誤在哪里或者我可以如何實作該功能?
并且要明確一點:Fold 累加一個值,從初始值(在本例中為 0)開始,并將從左到右的操作應用于當前累加器和每個元素,還是我弄錯了?
編輯(我希望可以編輯一個問題而不是問一個新問題):
是否可以回傳整個串列而不僅僅是一個 int?我剛剛找到了回傳整數或布林值的示例。我嘗試了什么:我使用了上面相同的函式簽名。但我不想回傳一個 Int,而是回傳一個串列:
fun <A> returnList(list: List<A>, predicate: (A) -> Boolean): List<A> {
return list.fold(mutableListOf()) {
acc, a ->
if (predicate(a)) {
acc.add(a)
} else {
acc
}
}
}
我發現的問題是acc.add(a)回傳布林值而不是串列,因此 IDE 將其標記為錯誤。那么有沒有辦法回傳一個串列?
提前致謝。
uj5u.com熱心網友回復:
通過說return你回傳整個count函式。你可以return@fold改用。很喜歡
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) {
acc, a ->
if (predicate(a)) {
return@fold acc 1
}
return@fold acc
}
}
或者,也許更好的是這樣做
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) {
acc, a ->
if (predicate(a)) {
acc 1
} else {
acc
}
}
}
lambda 中的最后一個運算式隱含地也是它的回傳值
uj5u.com熱心網友回復:
試試這樣:
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) { acc, a -> if (predicate(a)) acc 1 else acc }
}
fun main(args: Array<String>) {
val x = listOf<Int>( 1, -2, 3, 10, -5, 8, 12);
println(count(x, { it > 0 && it < 10 }))
}
查看此站點使我清楚地了解了必要的更改。
這種形式是否必要,因為 fold 使用尾遞回?看看原因是什么很有趣。
uj5u.com熱心網友回復:
fun <A> count(list: List<A>, predicate: (A) -> Boolean): Int {
return list.fold(0) { acc, a -> acc predicate(a).run { if (this) 1 else 0 } }
}
uj5u.com熱心網友回復:
我在 kotlin-forum 中找到了如何使用折疊回傳串列(請參閱我的問題編輯)的答案:
而不是寫:
fun <A> returnList(list: List<A>, predicate: (A) -> Boolean): List<A> {
return list.fold(mutableListOf()) {
acc, a ->
if (predicate(a)) {
acc.add(a)
} else {
acc
}
}
}
你可以寫(下面的解決方案是 al3c在 kotlin 論壇中提供的):
fun <A> returnList(list: List<A>, predicate: (A) -> Boolean): List<A> {
return list.fold(mutableListOf()) {
acc, a ->
if (predicate(a)) {
acc.add(a)
}
acc
}
}
通過這樣做,代碼回傳的不是單個整數、字符或布林值,而是整個串列。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/416608.html
標籤:
