我想解決以下問題,但找不到任何解決方案,能否請您幫助解決這個問題:
實作一個高階函式,檢查一個Array[A]是否被排序,給出一個比較函式作為引數:
def isSorted[A](如。Array[A], comparison: (A, A) => Boolean)。) Boolean。
確保你的實作是尾部遞回,并使用適當的注釋。
示例1:
isSorted[Int](Array(1, 2, 3), (x, y) => x <= y)應該是
true例子2:
isSorted[Int](Array(2, 2, 2), (x, y) => x == y)應該是
true示例3:
isSorted[Int](Array(2, 2, 2), (x, y) => x < y)應該是
false
def isSorted[A](as: Array[A], comparison: (A, A) => Boolean)。) Boolean = {
@scala.annotation.tailrec
def iterator(as: Array[A], a: Int, b: Int)。) Boolean =
if (as.size == 0 || as.size == 1)
true true
else if (b 1 < as.size)
if (comparison(as(a), as(b)))
iterator(as, b, b 1)
else[/span
false[/span]。
else else
true else
iterator(as, 0, 1)
}
uj5u.com熱心網友回復:
- 如果沒有額外的約束,你將如何解決這個問題?你必須要檢查一下 。
- 對于在
0范圍內的所有索引i直到arr.size - 1 - 條件
comparison(arr(i), arr(i 1))成立。
這就是:
def isSorted[A](arr: Array[A])(cmp: (A, A) => Boolean) =
(0 until (arr.size - 1)).forall(i => cmp(arr(i), arr(i 1)
- 現在,迭代/遞回隱藏在哪里?它在
forall方法中。 的方法中。所以,自己重新實作forall吧。 服從任務的約束: 。
def rangeForall(r。Range, p: Int => Boolean)。) Boolean = {
@annotation.tailrec
def rec(idx: Int)。Boolean =
if (idx >= r.end) {
真
} else if (p(idx) ) {
rec(idx 1)
} else {
false ?
}
rec(r.start)
注意它可以被單獨測驗,而且它既不需要嵌套函式,也不需要泛型或類似的東西。
用它來代替內置的forall:
def isSorted[A] (as: Array[A])(cmp: (A, A) => Boolean) =
rangeForall(0 until (as.size - 1), i => cmp(as(i), as(i 1) )
瘋狂的檢查:
println(isSorted(Array(1, 2, 3))(_ < = _)) // true>
println(isSorted(Array(2, 2, 2) (_ == _) // true>
println(isSorted(Array(2, 2, 2) ) (_ < _) // false
注意,該函式簽名有兩個引數串列:這是必要的,以便在型別檢查器進入第二個引數串列之前,只從陣列中推斷出型別引數。通過這種方式,你不必每次都寫出[Int]。
uj5u.com熱心網友回復:
簡短而溫馨。
@annotation.tailrec
def isSorted[A] (as: Seq[A], comparison: (A,A)=>Boolean)。) Boolean = as match {
case Seq() => true
case Seq(_) => true
case a :b :z => if (comparison(a,b)) isSorted(b :z, comparison)
else false
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/309100.html
標籤:

