2017-04-26 149 views
0

我正在處理函數以遞歸方式運行一個Ints列表並返回一個布爾值,指出列表中的每個項目是否是相同的數字。我在下面刺了一下,但沒有通過我正在運行的測試。這是我得到的,任何建議都非常感謝。謝謝!斯卡拉 - 遞歸比較函數

def equalList (xs : List[Int]) : Boolean = { 
def equalAux (xs:List[Int], value:Int) : Boolean = { 
    xs match { 
     case Nil => true 
     case x :: xs if (x == value) => equalAux(xs, x) 
     case x :: xs if (x != value) => false 
      } 
} 
    equalAux(xs, x) 
} 
+0

你能舉一個例子說明這是失敗嗎? – Tyler

+0

現在我實際上遇到了一個編譯錯誤,當我打電話給我的輔助功能,說「找不到:值x」。我嘗試將其更改爲「xs.head」,但這不適用於空列表。我相信那是以前的失敗案例。 – Polyphase29

回答

2

正如您在您的評論說,你只需要確保該列表是不是空的,所以你可以給一個初始值的遞歸函數:

def equalList(xs: List[Int]): Boolean = { 

    def equalAux (xs: List[Int], value: Int): Boolean = { 
    xs match { 
     case Nil => true 
     case x :: xs if x == value => equalAux(xs, x) 
     case x :: _ if x != value => false 
    } 
    } 

    // Check to make sure the list has at least one item initially 
    xs match { 
    case Nil => true 
    case head :: tail => equalAux(tail, head) 
    } 
} 

println(equalList(List.empty))   // true 
println(equalList(List(1)))    // true 
println(equalList(List(1, 1, 1, 1)))  // true 
println(equalList(List(1, 1, 1, 1, 2))) // false 
println(equalList(List(1, 2, 1)))  // false 
+0

啊!這工作!謝謝一堆。 – Polyphase29

0

你需要一個遞歸函數?如果沒有,我會用設置爲一招:

myList.toSet.size <= 1 // because empty list returns true. Else make it == 1 

如果你確實需要遞歸,然後@Tyler答案是答案,我也給。