2014-12-23 46 views
2

我正在搞亂Coursera的函數式編程課程,我偶然發現了一些奇怪的東西。此問題要求您僅使用方法isEmptyheadtail查找整數列表的最大值。我的解決方案是一個遞歸函數,如果沒有更多元素,則捕獲UnsupportedOperationException。該解決方案似乎沒有工作,但我認爲這是因爲這個例外從未被捕獲。Scala中具有尾部功能的最大元素

/** 
    * This method returns the largest element in a list of integers. If the 
    * list `xs` is empty it throws a `java.util.NoSuchElementException`. 
    * 
    * You can use the same methods of the class `List` as mentioned above. 
    * 
    * ''Hint:'' Again, think of a recursive solution instead of using looping 
    * constructs. You might need to define an auxiliary method. 
    * 
    * @param xs A list of natural numbers 
    * @return The largest element in `xs` 
    * @throws java.util.NoSuchElementException if `xs` is an empty list 
    */ 
    def max(xs: List[Int]): Int = 
    { 
    def maxOfTwo(value1: Int, value2: Int) = { 
     if(value1 > value2) value1 
     else value2 
    } 
    println(xs.size) 
    try { maxOfTwo(xs.head, max(xs.tail)) } 
    catch { case noTail: UnsupportedOperationException => xs.head } 
    } 

當我使用下面的代碼,這是剛剛更換UnsupportedOperationExceptionException一切完美。我在這裏錯過了什麼嗎?

def max(xs: List[Int]): Int = 
    { 
    def maxOfTwo(value1: Int, value2: Int) = { 
     if(value1 > value2) value1 
     else value2 
    } 
    println(xs.size) 
    try { maxOfTwo(xs.head, max(xs.tail)) } 
    catch { case noTail: Exception => xs.head } 
    } 
+1

你應該添加'homework'標籤。 :) –

+0

@AlexCruise它是否真的算作功課,如果它是一個MOOC,甚至不在會話中? – ThomYorkkke

回答

1

您無法捕獲java.util.NoSuchElementException與UnsupportedOperationException模式。 順便說一句,你的代碼拋出異常兩次。第二個異常由catch塊引發,調用xs.head

+0

嗯,好吧。我以爲List.tail拋出一個UnsupportedOperationException? – ThomYorkkke

+2

如果可遍歷集合爲空,則List.tail拋出UnsupportedOperationException,但List.head拋出NoSuchElementException並首先被調用。 – Przemek

2

我認爲這將是更好的:

def max(xs: List[Int]): Option[Int] = { 
    @tailrec 
    def go(l: List[Int], x: Int): Int = { 
     l match { 
     case Nil => x 
     case h :: t => if (x > h) go(t, x) else go(t, h) 
     } 
    } 
    if (xs.isEmpty) None else Some(go(xs.tail, xs.head)) 
    } 

結果類型爲Option,因爲列表可以是空的。

UPDATE

當使用UnsupportedOperationException,因爲當您嘗試訪問一個空列表,你也應該趕上NoSuchElementExceptionxs.head它失敗。它適用於Exception,因爲它是這兩個例外的基類。

+0

是的,但我更感興趣的是爲什麼我的解決方案在我使用異常時工作,並且在使用UnsupportedOperationException時失敗。 – ThomYorkkke

+0

因爲當您嘗試訪問空列表的xs.head時,您還應該捕獲java.util.NoSuchElementException。例外是兩個基類,這就是它的工作原理。 – user5102379

相關問題